对于我写的一些简单的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个,我不知道为什么......
任何人都有帮助吗?
答案 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();