C语言里为什么fgets很少用?

来源:百度知道 编辑:UC知道 时间:2024/06/08 01:18:13
一个在国外学计算机的同学让我帮他设计个程序,因为输入中有空格,用scanf不方便,便用了gets。可同学老师说用gets太危险容易溢出,于是他自己换成fgets,一开始我以为fgets只能读文件,这次仔细看了函数解释才知道也可以读输入的,而且还可以规定读入的长度防止溢出,还可以读入空格,既然这么方便,为什么在C语言的大部分教材里对这个函数一笔带过呢,根本不讲他读输入的功能,就连在文件操作中对他讲解也很少,是有什么缺点吗?

因为fgets函数只能输入字符串,而Scanf()能输入多种类型的数据,加上一般的C语言教材往往重视讲授原理,而对程序健壮性、异常处理等考虑不多,所以一般资料很少提及fgets函数。
scanf在获取用户输入的字符串时,遇到空格、制表符即终止,并在结尾自动加上”\0″。gets在获取用户输入字符串时,遇到空格、制表符不会终止,在结尾也会自动加上“\0”。
由于scanf和gets这两个函数不对输入的长度进行核查,即使用户输入超过了规定的buffer容量,函数也会接受输入,造成缓冲区溢出,程序崩溃。所以建议实际使用时最好用fgets函数来替代。

附上fgets函数的有关说明:
fgets函数原型:char *fgets(char *buf, int bufsize, FILE *stream);

参数:
1. *buf: 字符型指针,指向用来存储所得数据的地址。
2. bufsize: 整型数据,指明存储数据的大小。即每次最多读取bufsize-1个字符(第bufsize个字符赋'\0'),如果文件中的该行,不足bufsize个字符,则读完该行就结束。如若该行(包括最后一个换行符)的字符数超过bufsize-1,则fgets只返回一个不完整的行,但是,缓冲区总是以NULL字符结尾,对fgets的下一次调用会继续读该行。
3. *stream: 文件结构体指针,将要读取的文件流。如为stdin,则从键盘读取。

返回值:
成功,则返回第一个参数buf;
在读字符时遇到End-of-File,则EOF被设置,如果还没读入任何字符就遇到这种情况,则buf保持原来的内容,返回NULL;如果发生读入错误,ERROR被设置,返回NULL,buf的值可能被改变。因此我们不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。

我也是听你说了才知道fgets可以用于标准输入的,试了一下确实可以,而且也可以防止溢出,确实是个好东西.

至于为什么书上不怎么讲,一方面