我想知道的是什么样的区别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
到底作为字符串终止子。