我想知道如何以C scanf的格式解释空间。
例如,当我写:
scanf("%d ",&c);
从键盘读取的值不会直接分配给变量c
。
如果我写:
while(c != 0){
scanf("%d ",&c);
printf("c = %d\n", c);
}
我必须输入两次0
才能退出while
循环。
有人可以解释这种行为吗?
感谢。
答案 0 :(得分:4)
我认为c
被声明为:
int c;
当您有scanf
行
scanf("%d ",&c);
程序将读入c
代表int
的第一个非空白字符。它将跳过第一个非空白字符之前的所有空格。这解决了格式字符串的%d
部分。然后,它处理格式字符串的空白部分。它将等待从流处理读取到c
的最后一个字符后面的流中读取所有空格字符。只有在遇到后续的非空白字符时,它才会停止读取。第一个非空白字符可以是任何东西。它不一定是数字/数字。
如果您输入10k
作为输入,则会在阅读10
后立即停止。 k
仍将保留在输入流中。
答案 1 :(得分:1)
" "
要求scanf("%d ",&c);
在扫描整数后使用所有空白区域。
使用输入是行缓冲的。 <{1}}只发生scanf()
或'\n'
后才会收到任何内容。
实施例
EOF
。 " 123\n"
使用stdin
扫描scanf("%d"
并看到它不是数字,“取消”并将其重新放回" 123"
。'\n'
使用空格stdin
和等待以获取更多输入进行检查。scanf(" "
。 '\n'
继续第3步:扫描" 456\n"
,使用它,扫描stdin
,看到它不是空格,“取消”并将其重新放入{ {1}}。scanf(
的第二个空格会扫描' '
并看到它不是空格,“取消”并将其重新放回'4'
。最后,stdin
首先返回。它成功扫描第一个字段时返回1。注意2 输入已经发生。
下一个scanf(" "
会消耗'4'
,并继续执行上面的第2步。
建议不要在{-1}}的空白处使用格式结尾。
答案 2 :(得分:0)
N1256 7.19.6.2 fscanf函数
由白色空格字符组成的指令通过读取输入来执行 第一个非空格字符(仍未读取),或直到不再有字符 请阅读。
N1256 7.19.6.4 scanf函数
2 scanf函数等效于插入参数stdin的fscanf 在scanf的参数之前。