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();