繁体   English   中英

fgets和fscanf之间的区别?

[英]Difference between fgets and fscanf?

我对C中的fgets和fscanf有疑问。这两者之间到底有什么区别? 例如:

char str[10];
while(fgets(str,10,ptr))
{
counter++;
...

和第二个例子:

char str[10];
while(fscanf(ptr,"%s",str))
{
counter++;
...

当有一个包含由空格分隔的字符串的文本文件时,例如:AB1234 AC5423 AS1433。 在第一个示例中,while循环中的“counter”将不会提供与第二个示例中相同的输出。 当更改fgets函数中的“10”时,计数器将始终给出不同的结果。 这是什么原因? 还有人可以解释一下fscanf究竟做了什么,每个while循环中的字符串有多长?

函数fgets读取直到换行符(并且还存储它)。 带有%s说明符的fscanf读取直到任何空格并且不存储它...

作为旁注,您没有在scanf中指定缓冲区的大小,并且它不安全。 尝试:

fscanf(ptr, "%9s", str)

fgets读取到换行符。 fscanf只能读取空格。

在您的示例中, fgets将从输入流中读取最多9个字符,并将它们与0终止符一起保存到str 它不会跳过前导空格。 如果在最大字符数之前看到换行符(将保存为str )或EOF,它将停止。

带有%s转换说明符的fscanf将跳过任何前导空格,然后读取所有非空白字符,将它们保存为str后跟0终止符。 它会在下一个空格字符或EOF处停止读取。 如果没有明确的字段宽度,它将读取与流中的非空白字符一样多的非空白字符,可能会超出目标缓冲区。

因此,假设输入流看起来像这样: "\\t abcdef\\n<EOF>" 如果您使用fgets读取它, str将包含"\\t abcdef\\n\\0" 如果使用fscanfstr可能包含"abcdef\\0" (其中\\0表示0终结符)。

fgets读了整行。 带有%s fscanf读取一个字符串,按空格分隔(或\\ n,\\ t等等)。 无论如何,你不应该使用它们,除非你确定你读到的数组大到足以包含输入。 您写了When changing the "10" in the fgets function the counter will always give different results. 请注意,fgets和scanf不知道要读取多少字节。 你应该告诉他们。 更改“10”只是放大这些函数写入的缓冲区。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM