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

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

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

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

许多人将使用fgets()读取一行数据,然后使用sscanf()来解析它。

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

这里对这个主题的讨论很好 – http://cboard.cprogramming.com/c-programming/109243-scanf-vs-fgets.html

如何使用scanf输入空格? (那是我的邪恶双胞胎因为忘记了这个 – 而不是我)

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

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

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

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

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

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

查看两个函数的原型:

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

int scanf(const char * format,…);

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

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

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

应该注意, 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相连接。