scanf需要“额外输入”

时间:2015-11-24 22:29:14

标签: c 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个参数:

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

参数(下线)

参数(下线)

参数(下线)

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

任何人都有帮助吗?

3 个答案:

答案 0 :(得分:3)

正如@chqrlie@Blue Moon所述,格式为空格' ''\n''\n'或任何空白区域一样。它指示scanf()消耗空白空间,例如 Enter 中的'\n',直到检测到非空白空间。然后将该非空格字符放回stdin以进行下一个输入操作。

scanf("%d\n", ...)之后输入一些非空格,

int才会返回。因此需要第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

答案 1 :(得分:2)

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

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

但是,由于%d始终会忽略空白字符,因此您不会在此处显示任何空白字符。因此,只需从格式字符串中删除所有空格\n字符。

答案 2 :(得分:1)

scanf格式字符串中的空白字符是指示读取空格字符的指令,直到您获得非空格字符。格式字符串中的尾随\n会导致scanf使用用户键入的换行符并继续询问输入,直到看到非空格字符,但保留在输入缓冲区中。

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

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

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

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