scanf()和fgets()之间的区别

时间:2009-08-09 20:06:12

标签: c scanf fgets

我想知道fgets()scanf()之间的区别。我使用C作为我的平台。

6 个答案:

答案 0 :(得分:24)

有许多不同之处。两个关键的是:

  • fgets()可以从任何打开的文件中读取,但scanf()只读取标准输入。
  • fgets()从文件中读取“一行文字”; scanf()可用于此目的,但也处理从字符串到内置数字类型的转换。

许多人会使用fgets()阅读一行数据,然后使用sscanf()对其进行剖析。

答案 1 :(得分:7)

int scanf(const char * restrict format, ...);

scanf(3)在给定输入上搜索由格式参数定义的某些模式,称为 stdin ,模式由您定义。 scanf(3)的给定输入(取决于其变体(scanf,fscanf,sscanf,vscanf,vsscanf,vfscanf))可以是字符串或文件。

char *fgets(char * restrict str, int size, FILE * restrict stream);

fgets(3)只是从输入文件 stream 中读取,并将字节作为空终止字符串复制到缓冲区 str 并将缓冲区的输出限制为 size 中的给定字节。

答案 2 :(得分:6)

Scanf不执行边界检查。 fgets可能是更好的选择。然后,您可以使用sscanf()对其进行评估。

在此讨论该主题的良好讨论 - http://cboard.cprogramming.com/c-programming/109243-scanf-vs-fgets.html

How do you allow spaces to be entered using scanf?(那是我的邪恶双胞胎因为忘记这个而不是我的演讲)

答案 3 :(得分:1)

scanf解析您读入(或创建)的字符串,fgets从打开的FILE *中读取一行。或者你的意思是fscanf?

答案 4 :(得分:1)

应该注意scanf模式规范允许字段宽度限制:

scanf( " %80s", mybuffer );

但是,printf()允许将宽度作为变量传递(使用'*'):

printf( "My name is %*s.\n", 20, name );

scanf()没有。 (它将'*'解释为完全禁止/忽略该字段的标志。)这意味着你最终会做这样的事情:

#define NAMEWIDTH 40
char buffer[ NAMEWIDTH + 4 ];
...
scanf( " %40x", buffer );

并且无法将scanf()中的字段宽度40与缓冲区声明中的缓冲区宽度40相连接。

答案 5 :(得分:0)

主要区别在于 scanf 对可以读取的字符数(默认使用)没有限制,而 {{1} } 具有可以读取的最大char数。

查看两个函数的原型:

  

char * fgets(char * dest,int size,FILE * stream);

     

int scanf(const char * format,...);

您可以看到fgets的第二个参数强制读取最多大小的char。

另一个明显区别是返回值: fgets 在成功时返回指向 fgets 的指针; dest 返回成功匹配和分配的输入项目数。 然后, scanf 函数根据格式扫描输入,并从标准输入流 stdin 读取输入,同时scanf默认从 FILE *流读取输入。

总之,您可以使用fgets从FILE读取数据并将它们插入到固定大小的数组中(例如)没有多大意义。 scanf的一个优点是输出数据的格式化:如果函数读取scanf,则输出为12345\n,而fgets读取并返回12345(包括),最后添加\n作为字符串终止符。