我有以下问题。 在下面的代码中,如果输入是单个字符,那么它将在输出窗口中成功打印。但如果输入多个字符,它会分别打印每个字符(两个字母数字字符),直到完成所有字符。
#include<stdio.h>
#include<conio.h>
void main()
{
char c;
printf("enter any character: \n");
while(scanf("%c",&c)!=0)
{
printf("%c\t",c);
}
getche();
}
问题:
如果在输入函数中使用单个字符说明符(%c
),则它必须仅打印第一个字符并忽略其余字符。但它如何分别打印出所有输入字符。任何人都可以澄清一下吗?
无法添加输出屏幕的图像。
答案 0 :(得分:2)
输入多个char
并按 ENTER 后,所有char
将存储在标准输入中。运行scanf("%c",&c)
一次将读取一个char
并将其余输入保留在stdin
中。因此,对于下一次,当控制达到scanf("%c",&c)
时(由于while()
循环控制),它将读取下一个char
,依此类推,直到匹配失败并{{1 }返回0。
如scanf()
章节§7.21.6.2所述,C11
失败的条件,返回scanf()
(在任何匹配发生之前输入失败的情况< / em>)或EOF
(如果匹配失败,0
无法进行)
[...]如果输入的长度 item为零,指令的执行失败;这种情况是匹配失败,除非 文件结束,编码错误或读取错误阻止了流的输入,其中 如果是输入失败。
TL; DR 调用%c
后输入缓冲区自动丢弃本身如果您希望在调用另一个缓冲区之前清除缓冲区{ {1}},你需要自己做。
话虽如此,scanf()
不是托管环境中scanf()
的标准签名。您至少需要使用void main()
。
答案 1 :(得分:0)
缓冲区(stdin)不为空。您只获取一个字符,但是在循环中执行它。如果你想一次只取一个字符。
答案 2 :(得分:0)
scanf
函数扫描stdin
缓冲区,查找指定模板的第一次出现。在你的情况下,它是一个单一的角色。但是缓冲区在完成时不会被清除,因此如果您再次呼叫scanf
- 您将从流中获取下一个字符。使用特殊终端配置可以避免此行为。有关示例,请参阅termios
。
答案 3 :(得分:0)
重复执行代码
scanf("%c", &c);
将读取输入的每个字符 - 包括您键入的newline
。您可以将其更改为使用
scanf(" %c", &c);
请注意,格式规范之前的区别是space
。除此之外,没有任何输入被忽略。