main()
{
char name[20];
printf("enter your name\n");
scanf("%s",name);
printf("%s",name);
gets(name);
puts(name);
}
输入:萨姆帕德·萨哈
Output
桑帕德·萨哈
这里的 put 仅使用来自的输入gets()
.
因为,如果我省略这个printf()
输出将是
Saha
所以这里的 put 不会打印通过给出的任何内容scanf()
.
main()
{
char color[20];
printf("enter your name\n");
scanf("%s",color);
puts(color);
}
但在这儿puts()
使用来自的输入scanf()
also.
这里的问题是,对于像这样的输入
abc XYZ
the code
scanf("%s",name);
reads only“abc”部分和“XYZ”留在输入缓冲区中。后来的gets()
阅读该内容,并且puts()
打印该内容。因为你没有newline
之后printf()
,输出不是flushed以及结果puts()
is appended到输出流缓冲区,一旦程序完成执行,整个输出缓冲区就会被刷新并打印whole一起输入。
所以,在另一种情况下,当你放弃printf()
,读取的值scanf()
("abc")不打印。
详细说明,%s
with scanf()
无法读取空格分隔的输入,它会在遇到第一个空格时停止读取。
Quoting C11
。第§7.21.6.2章
s
匹配一系列非空白字符。 [...]
这表明,对于%s
, scanf()
遇到第一个空格时停止阅读。
来到第二种情况,输入不contain空格(即未给出空格分隔的输入),scanf()
读到whole输入(直到终止换行符),因此,printf()
and puts()
输出相同。
也就是说,不使用gets(), 有危险 https://stackoverflow.com/q/1694036/2173917. use fgets() https://linux.die.net/man/3/fgets反而。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)