scanf需要“额外输入”

对于我写的一些简单的HW代码,我需要通过scanf函数获得7个参数:

scanf("%d %d %d %d\n", &vodka, &country, &life, &glut); scanf("%d\n", &ageof); scanf("%d\n", &dprice); scanf("%d\n", &mprice); 

如你所见,我按此顺序要求7个参数:

argument [space]参数[space]参数[space]参数(下行)

参数(下线)

参数(下线)

参数(下线)

但是,当运行代码时,我突然需要输入其中的8个,我不知道为什么……

有人帮忙吗?

正如@chqrlie和@Blue Moon所解释的格式中的空白区域,无论是' ''\n''\n'还是任何白色空间都做同样的事情。 它指示scanf()消耗空白,例如来自Enter的 '\n' ,直到检测到非空白空间。 然后将该非空白字符放回到stdin以进行下一个输入操作。

int之后输入一些非空白区域之前scanf("%d\n", ...)不会返回。 因此需要第8个输入。 第8个输入未被消耗,但可用于后续输入。


读取4行输入的最佳方法是……鼓声…读4 然后处理输入。

 char buf[4][80]; for (int i=0; i<4; i++) { if (fgets(buf[i], sizeof buf[i], stdin) == NULL) return Fail; } if (sscanf(buf[0], "%d%d%d%d", &vodka, &country, &life, &glut) != 4) { return Fail; } if (sscanf(buf[1], "%d", &ageof) != 1) { return Fail; } if (sscanf(buf[2], "%d", &dprice) != 1) { return Fail; } if (sscanf(buf[3], "%d", &mprice) != 1) { return Fail; } // Use vodka, country, life, glut, ageof, dprice, mprice return Success 

如果格式字符串中有空格 ,则告诉scanf()忽略任意数量的空白字符。 因此, %d之间的空格需要输入非空白字符,这些字符将用于后续%d每一个。

空格\n在以下scanf()调用中的效果不是很明显。 但是每个最后一次scanf()末尾的换行符强制您输入一个非空白字符。 因此,看起来scanf()需要额外的输入。

但是,这里没有任何空格字符,因为%d总是会忽略空格字符。 因此,只需从格式字符串中删除所有空格\n字符。

scanf格式字符串中的空白字符是指示读取空白字符的指令, 直到获得非空白字符 。 格式字符串中的尾随\n会导致scanf使用用户键入的换行符,并且在看到非空格字符之前一直要求输入,但是留在输入缓冲区中。

要完全使用\n ,您可以使用这种丑陋的scanf格式:

 scanf("%d%*1[\n]", &mprice); 

或者您可以删除尾随\ n并使用getchar()使用该字符但请注意,这些方法都不能提供输入的精确匹配:

 scanf("%d", &mprice); getchar();