fgets()
我想知道和之间有什么区别scanf()
。我使用 C 作为我的平台。
6 回答
存在多种差异。两个关键是:
fgets()
可以从任何打开的文件中读取,但scanf()
只能读取标准输入。fgets()
从文件中读取“一行文本”;scanf()
可用于此,但也处理从字符串到内置数字类型的转换。
很多人会用fgets()
读取一行数据,然后用sscanf()
它来剖析。
int scanf(const char * restrict format, ...);
scanf(3)搜索由给定输入上的format 参数定义的特定模式,称为stdin,其中模式由您定义。scanf(3)的给定输入,取决于其变体(scanf、fscanf、sscanf、vscanf、vsscanf、vfscanf),可以是字符串或文件。
char *fgets(char * restrict str, int size, FILE * restrict stream);
fgets(3)只是从输入文件流中读取一行并将字节作为空终止字符串复制到缓冲区str并将缓冲区的输出限制为size中的给定字节。
Scanf 不执行边界检查。fgets 可能是更好的选择。然后,您可以使用 sscanf() 对其进行评估。
在这里很好地讨论这个话题 - http://cboard.cprogramming.com/c-programming/109243-scanf-vs-fgets.html
你如何允许使用scanf输入空格?(那是我邪恶的双胞胎因为忘记这一点而被训斥——不是我)
应该注意的是,scanf
模式规范确实允许字段宽度限制:
scanf( " %80s", mybuffer );
但是, whereprintf()
允许将宽度作为变量传递(使用 '*'):
printf( "My name is %*s.\n", 20, name );
scanf()
才不是。(它将“*”解释为完全禁止/忽略该字段的标志。)这意味着你最终会做这样的事情:
#define NAMEWIDTH 40
char buffer[ NAMEWIDTH + 4 ];
...
scanf( " %40x", buffer );
并且无法将scanf()
缓冲区声明中的字段宽度 40 与缓冲区宽度 40 连接起来。
scanf 解析您读入(或创建)的字符串,fgets 从打开的 FILE* 中读取一行。或者你的意思是fscanf?
主要区别在于对scanf
可以读取的字符数没有限制(默认使用),而fgets
对可以读取的字符数有最大限制。
看两个函数的原型:
char * fgets (char * dest, int size, FILE * stream);
int scanf (const char * format, ...);
可以看到第二个参数fgets
强制读取最多 size char。
另一个明显的区别是返回值:成功fgets
时返回一个指针dest
;scanf
返回成功匹配和分配的输入项的数量。然后,scanf函数根据format扫描输入,并从标准输入流stdin中读取输入,同时默认fgets
从FILE * 流中读取输入。
总之,您可以使用scanf
从 FILE 读取数据并将它们插入到固定大小的数组中(例如)并没有多大意义。的一个优点scanf
是输出数据的格式:如果函数读取12345\n
,则输出为12345
,而 fgets 读取并返回直到\n
(包含),最后添加 a\0
作为字符串终止符。