main()
{
char name[20];
printf("enter your name\n");
scanf("%s",name);
printf("%s",name);
gets(name);
puts(name);
}
输入:森柏萨哈
产量
森柏萨哈
这里提出只使用取自输入gets()
。
因为,如果我省略此printf()
输出将是
萨哈
所以在这里提出不打印通过任何代价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()
打印出。 当你没有一个newline
后printf()
输出不会刷新和成果puts()
追加到输出流缓冲区,一旦程序执行完毕,整个输出缓冲区刷新干脆打印整个输入在一起。
所以,在其他情况下,当你放下printf()
读出的值scanf()
(“ABC”)不打印。
为了详细说明, %s
与scanf()
无法读取空格分隔的投入,它停止在遇到的第一个空格读数。
引用C11
。 章§7.21.6.2
s
匹配的非空白字符的序列。 [...]
这表明,为%s
, scanf()
停止读取在遇到第一个空格。
即将第二种情况下,当输入不包含空白,(即,不是空格分隔输入给出), scanf()
读取整个输入(高达终止新行),因此,无论是printf()
和puts()
输出。
这就是说, 不要使用gets()
,这是危险的 。 使用fgets()
代替。