scanf";“额外输入”;必修的

scanf";“额外输入”;必修的,c,scanf,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]参数(下线) 参数

对于一些简单的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个,我不知道为什么

是否有任何帮助?

当格式字符串中有空格时,请告诉
scanf()
忽略任意数量的空格字符。因此,在
%d
之间的空格需要输入一个非空白字符,该字符用于后续的
%d
中的每个字符

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


但是,您在这里实际上不需要任何空白字符,因为
%d
始终会忽略空白字符。因此,只需从格式字符串中删除所有空格和
\n
字符。

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

要准确地使用
\n
格式,可以使用以下格式:

scanf("%d%*1[\n]", &mprice);
或者,您可以删除尾随符\n并使用
getchar()
使用字符,但请注意,这两种方法都不提供输入的精确匹配:

scanf("%d", &mprice);
getchar();
如和所述,格式中的空格可以是
'
'\n'
'\n'
或任何空格都做相同的事情。它指示
scanf()。然后将该非空白字符放回
stdin
,以进行下一次输入操作

scanf(“%d\n”,…)
直到在
int
后面输入一些非空格后才会返回。因此需要第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
charbuf[4][80];

对于(int i=0;i从
scanf
移动
\n
。如果要强制执行“(下线)”,然后您应该使用
fgets
读取行,并使用
sscanf
解析行。使用
scanf
用户可以在一行中键入所有数字,或者在单独的行中键入每个数字,您永远不会知道它们之间的区别。好吧,那么haccks是对的。以下是手册页上关于
\n
的内容:“空白区域。”格式字符串中的(如空格、制表符或换行符)匹配输入中的任意数量的空格,包括无空格。“因此,
\n
根本无法按您预期的方式工作。啊哈。收到了。非常感谢!