看跌和获取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
匹配一系列非空白字符。 […]
这表示对于%s
, scanf()
在遇到第一个空格时停止读取。
来到第二种情况,输入不包含空格(即,不给出空格分隔的输入), scanf()
读取整个输入(直到终止换行),因此, printf()
和puts()
输出相同。
也就是说, 不要使用gets()
,这很危险 。 使用fgets()
代替。