gets ()的一个不足是它不检査预留存储区是否能够容纳实际输入的数据。多出来的字符简单地溢出到相邻的内存区。fgets ()函数改进了这个问题,它让您指定最大读入字符数。由于fgets ()是为文件I/O 而设计的,在处理键盘输入时就不如gets ()那么方便。fgets ()和gets ()有三方面不同:
/* name3.c --使用fgets ()读取一个名字*/•它需要第二个参数来说明最大读入字符数。如果这个参数值为n, fgets ()就会读取最多n-1个 字符或者读完一个换行符为止,由这二者中最先满足的那个来结束输入。
•如果fgets ()读取到换行符,就会把它存到字符串里,而不是像gets ()那样丢弃它。
•它还需要第三个参数来说明读哪一个文件。从键盘上读数据时,可以使用stdin(代表j/andardiViput) 作为该参数,这个标识符在stdiah中定义。
#include<stdio.h>
#define MAX 81
int main(void)
{
char name[MAX];
char *ptr;
printf("Hi what's your name?\n");
ptr=fgets(name,MAX,stdin);
printf("%s? Ah! %s!\n",name,ptr);
return 0;
}
问题在于fgets()把换行符存储到字符串里,这样每次显示字符串时就会显示换行符。本章后面“其 他字符串函数”小节的结尾将会介绍如何用strchr ()来定位和删除换行符。
由于gets ()不检査目标数组是否能够容纳输入,所以很不安全^的确,几年前就有人注意到一些UNIX操作系统代码使用gets (),于是他们利用这个弱点,用很长的输入覆盖操作系统的代码,从而发明了在 UNIX网络上传播的“蠕虫(worm) ”病毒。那些系统代码后来被不使用gets ()的代码所代替。因此对 于重要的编程,应该使用fgets ()而不是gets (),但本书使用了更随便的做法。