scanf()的和与fgets之间的差异()(Difference between scanf()

2019-06-18 05:56发布

我想知道的是什么样的区别fgets()scanf() 。 我使用C作为我的平台。

Answer 1:

有多种差异。 两个关键的是:

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

很多人会使用fgets()读取一行数据,然后使用sscanf()来解剖它。



Answer 2:

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

的scanf(3)搜索通过在被称为标准输入 ,其中,所述图案是通过所定义的给定的输入格式参数定义的某些图案 。 给定输入到的scanf(3),这取决于它的变体(scanf的,的fscanf,sscanf的,vscanf,页vsscanf,vfscanf),可以是一个字符串或一个文件。

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

与fgets(3)刚读取从输入文件 线和字节空终止字符串输出到缓冲器复制到缓冲器STR并限制到给定的字节大小



Answer 3:

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

话题的讨论好这里- http://cboard.cprogramming.com/c-programming/109243-scanf-vs-fgets.html

你如何允许输入空格使用scanf函数? (这是我的邪恶的双胞胎越来越讲授可以用来遗忘这个 - 不是我)



Answer 4:

scanf函数解析您阅读(或创建)一个字符串,并与fgets从打开的文件读取一行*。 还是你的意思的fscanf?



Answer 5:

应当指出的是, scanf图形的规格确实允许字段宽度限制:

scanf( " %80s", mybuffer );

但是,其中printf()允许宽度作为变量被传递(与“*”):

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

scanf()没有。 (这解释“*”为标志,来禁止/完全忽略的领域。)这意味着你最终会做这样的事情:

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

并没有办法连接字段在宽度40 scanf()与所述缓冲声明缓冲器宽度40。



Answer 6:

主要的区别在于,实际上scanf有可以读取(在其默认使用)的字符数没有限制,而fgets具有可读取字符的最大数量。

见两个函数原型:

字符*与fgets(字符* DEST,INT尺寸,FILE *流);

INT的scanf(为const char *格式,...);

你可以看到,第二个参数fgets征收至多大小字符阅读。

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

总之,你可以使用scanf从文件中读取数据并将其插入到一个固定大小的数组(例如)并没有太大的意义。 的优点scanf是输出数据的格式:如果函数读取12345\n ,则输出为12345 ,而与fgets读取并返回,直到\n (含),加入\0到底作为字符串终止子。



文章来源: Difference between scanf() and fgets()
标签: c scanf fgets