1、 gets函数
gets函数从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为‘\0’空字符,并由此来结束字符串。
gets函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。这个事实导致gets函数只适用于玩具程序,为了避免这种情况,我们可以用fgets(stdin) (fgets实际上可以读取标准输入,即大多数情况下的键盘输入)来替换gets()。在V7的手册(1979年)中说明:为了向后兼容,gets删除换行符,gets并不将换行符存入缓冲区(以‘\0’替代)。
注意:
因为linux 和 windows的文件在换行符上编码不一样,linux的换行是\0,windows的换行是\13\0.
LINUX下编译C程序时,会出现警告:warning: the `gets' function is dangerous and should not be used.
2、fgets函数
fgets函数从文件结构体指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋'\0'),如果文件中的该行,不足bufsize-1个字符,则读完该行就结束。如若该行(包括最后一个换行符)的字符数超过bufsize-1,则fgets只返回一个不完整的行,但是,缓冲区总是以NULL字符结尾,对fgets的下一次调用会继续读该行。
函数成功将返回buf,失败或读到文件结尾返回NULL。因此我们不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。
注意:
gets从终端读入是的字符串是用\0结束的,而fgets是以\n结束的.
例子:
fgets()函数原型
fgets(char * s,int size,FILE * stream);//用fgets(tempstr,9,stdin)//tempstr 为char[10]变量,9为要输入的字符串最大长度(最后会补上'\0'),stdin为从标准终端输入。
#include <stdio.h>如果使用fgets()读取某个文件,读取文件的时候bufsize大于该行的字符(不包括换行符‘\n’)总数加2(多出来的两个,一个保存文件本身的'\n'换行,一个保存字符串本身的结束标识'\0'),文件并不会继续读下去,仅仅只是这一行读取完,随后指向文件的指针会自动偏移至下一行。
int main ( ) {
char name[20];
printf("\n 输入任意字符 : ");
fgets(name, sizeof(name)-1, stdin);//stdin 意思是键盘输入
fputs(name, stdout); //stdout 输出
return 0;
}