我试图理解如何把功能在标准的C工作。我读到,它打印一个指定的
字符串添加到标准输出中,并在此字符串后添加一个换行符。然而,我得到了两个类似C程序的不同输出。
我尝试了两种方法来使用它(我只提供函数main):
1.
char s[20];
fgets(s,20,stdin);
puts(s);
字符串
char s[20]="Hello World";
puts(s);
型
在第一种情况下,如果我的输入是Hello World,那么在我的终端中输出是:
Hello World
型
(So在第二种情况下,在我的终端中,输出是:
Hello World
型
在这个例子中,似乎没有追加换行符,而我希望得到与案例1相同的输出。我不明白为什么输出不一样。可能是因为fgets,但我真的不明白为什么fgets使输出不同。
3条答案
按热度按时间vcudknz31#
第一个输出在传输的字符串末尾有两个换行符,而不是一个,第二个输出有一个换行符,而不是零。
在第一个输出中,第一个新行结束“Hello World”行,并将显示移动到下一行。第二个新行结束一个空白行。如果第二个新行不存在,那么终端输出(例如shell打印的提示)将出现在紧挨着“Hello World”的下一行,而不是在一个空白行之后。
在第二个输出中,换行符结束了“Hello World”行,并将显示移动到下一行。如果没有换行符,输出将继续在“Hello World”的同一行,而不是下一行。
第一个输出包含两个换行符,因为
fgets
在缓冲区中包含了它从输入字符串中读取的换行符,而puts
添加了另一个换行符。ql3eal8s2#
看起来让你困惑的行为不是
puts
,而是fgets
。在第二个例子中,有一个换行符,只是没有一个空行。如果
fgets
中的一行的解析因阅读一个换行符(而不是到达输入的文件结尾)而停止,则该换行符将包含在缓冲区中。因此,在第二个例子中,
s
包含"Hello World"
,在第一个例子中,它包含"Hello World\n"
。在这两种情况下,
puts
的行为是相同的,即追加一个新行。在第一个示例中,这导致打印两个连续的新行,显示为一个完全空白的行。vfwfrxfs3#
fgets
会在有空间的情况下将输入的结尾换行符存储到目标数组中;这就是结果不同的原因。