看跌和获取功能如何运作?

时间:2016-12-29 16:24:00

标签: c scanf gets puts

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()的输入。

1 个答案:

答案 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()输出相同。

那就是DO NOT use gets(), it is dangerous。请改用fgets()