main()
{
char name[20];
printf("enter your name\n");
scanf("%s",name);
printf("%s",name);
gets(name);
puts(name);
}
输入:Sampad Saha
输出
Sampad Saha
此处仅使用从gets()
获取的输入。
as,如果省略此printf()
,则输出将为
萨哈
因此,此处不会打印通过scanf()
给出的任何内容。
main()
{
char color[20];
printf("enter your name\n");
scanf("%s",color);
puts(color);
}
但此处puts()
也使用了来自scanf()
的输入。
答案 0 :(得分:4)
这里的问题是,对于像
这样的输入abc XYZ
代码
scanf("%s",name);
仅读取 “abc”部分,“XYZ”保留在输入缓冲区中。后来的gets()
读取了,puts()
打印出来。由于您在newline
之后没有printf()
,因此输出不是已刷新,而puts()
的结果是已附加到输出流缓冲区,一旦程序完成执行,整个输出缓冲区就会被刷新,一起打印整个输入。
因此,在另一种情况下,当您放弃printf()
时,不会打印scanf()
(“abc”)读取的值。
详细说明,带有%s
的{{1}}无法读取空格分隔的输入,它会在遇到的第一个空格处停止读取。
引用scanf()
。章节§7.21.6.2
C11
匹配一系列非空白字符。 [...]
表示,对于s
,%s
会在遇到第一个空格时停止阅读。
来到第二种情况,其中输入不包含空格(即,没有给出空格分隔的输入),scanf()
读取整体< / em>输入(最多终止换行符),因此scanf()
和printf()
输出相同。