看跌和获取function如何运作?

main() { char name[20]; printf("enter your name\n"); scanf("%s",name); printf("%s",name); gets(name); puts(name); } 

输入:Sampad Saha

产量

桑帕德萨哈

这里put只使用从gets()的输入。

因为,如果我省略这个printf()输出将是

萨哈

所以这里的put不会打印通过scanf()给出的任何内容。

 main() { char color[20]; printf("enter your name\n"); scanf("%s",color); puts(color); } 

但是这里的puts()使用了来自scanf()的输入。

这里的问题是,对于像这样的输入

abc XYZ

代码

  scanf("%s",name); 

读取“abc”部分,“XYZ”留在输入缓冲区中。 后来的gets()读取了这个,并且puts()打印出来。 由于在printf()之后没有newline ,因此输出不会被刷新,并且puts()的结果会附加到输出流缓冲区,一旦程序完成执行,整个输出缓冲区将被刷新完全打印出来整体输入。

因此,在另一种情况下,当您删除printf() ,不会打印scanf()“abc” )读取的值。

详细说明,带有scanf() %s无法读取空格分隔的输入,它会在遇到的第一个空格处停止读取。

引用C11 。 第§7.21.6.2

s匹配一系列非空白字符。 […]

这表示对于%sscanf()在遇到第一个空格时停止读取。

来到第二种情况,输入不包含空格(即,不给出空格分隔的输入), scanf()读取整个输入(直到终止换行),因此, printf()puts()输出相同。

也就是说, 不要使用gets() ,这很危险 。 使用fgets()代替。