【问题标题】:How do the puts and gets functions work?puts 和 get 函数是如何工作的?
【发布时间】:2017-05-14 00:03:37
【问题描述】:
main()
{
char name[20];

printf("enter your name\n");

scanf("%s",name);       
printf("%s",name);

gets(name);
puts(name);
}

输入:Sampad Saha

输出

桑帕德萨哈

这里 puts 仅使用从 gets() 获取的输入。

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

萨哈

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

main()
{
char color[20];

printf("enter your name\n");

scanf("%s",color);   
puts(color);
}

但这里puts() 也使用从scanf() 获取的输入。

【问题讨论】:

  • 你有什么问题?

标签: c scanf gets puts


【解决方案1】:

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

abc XYZ

代码

  scanf("%s",name);

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

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

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

引用C11。第 7.21.6.2 章

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

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

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

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

【讨论】:

  • 我不知道我是对还是错..但是打印省略的情况(第二个例子)不是因为在这种情况下使用了相同的变量才打印 Saha 吗?在第一种情况下,它被存储在输出缓冲区中,然后通过读取gets()`而丢失第三种情况很明显..
  • @coderredoc 对,只要pf/sfgets/puts 对使用相同的变量,就会是相同的。变量 between 这对可能会改变,但结果不会改变。 :)
最近更新 更多