fgets和fscanf有什么区别?

18

我有一个关于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循环中字符串有多长?

4个回答

17

函数fgets会读取直到遇到换行符(并存储它)。使用%s占位符的fscanf会一直读取直到空格,但不会存储它。

另外需要注意的是,在scanf中没有指定缓冲区大小是不安全的。请尝试:

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

谢谢您的回答,这对于fputs和fprintf也是类似的吗?或者它们之间有什么区别? - Chris
不,它们是不同的。例如,在printf中,“%s”不会停在空格处。请阅读手册。 - cnicutar

7

fgets会一直读取到换行符。而fscanf只会读取到空格。


6
在您的示例中,fgets将从输入流中读取最多9个字符,并将它们保存到str中,同时附带一个0终止符。它不会跳过前导空格。如果在最大字符数之前看到换行符(将保存到str)或EOF,它将停止读取。
使用fscanf%s转换说明符,将跳过任何前导空格,然后读取所有非空白字符,将它们保存到str中,后面跟着一个0终止符。它将在下一个空格字符或EOF处停止读取。如果没有显式字段宽度,它将读取流中与非空白字符相同数量的字符,可能会超出目标缓冲区。
因此,假设输入流如下所示:"\t abcdef\n<EOF>"。如果使用fgets来读取它,str将包含"\t abcdef\n\0"。如果使用fscanfstr可能包含"abcdef\0"(其中\0表示0终止符)。

2

fgets函数会读取整行文本。fscanf函数使用%s参数会读取由空格(或者换行符、制表符等)分隔的字符串。 不管怎样,只有在你确定所读取的数组足够大以容纳输入时才可以使用它们。 你写道:更改fgets函数中的“10”将使计数器始终给出不同的结果。请注意,fgets和scanf不知道要读取多少字节。你需要告诉它们。更改“10”只是扩大这些函数写入的缓冲区。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接