1. gets与fgets
gets函数原型:char*gets(char*buffer);//读取字符到数组:gets(str);str为数组名。
gets函数功能:从键盘上输入字符,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。
读取的换行符被转换为null值,做为字符数组的最后一个字符,来结束字符串。
注意:gets函数由于没有指定输入字符大小,所以会无限读取,一旦输入的字符大于数组长度,就会发生内存越界,
从而造成程序崩溃或其他数据的错误。
fgets函数原型:char *fgets(char *s, int n, FILE *stream);//我们平时可以这么使用:fgets(str, sizeof(str), stdin);
其中str为数组首地址,sizeof(str)为数组大小,stdin表示我们从键盘输入数据。
fgets函数功能:从文件指针stream中读取字符,存到以s为起始地址的空间里,知道读完N-1个字符,或者读完一行。
注意:调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加' ',并以str作为函数值返回。
2. 细节介绍
1,上面说到gets函数无限读取,没有上限。但是有些资料介绍说它最多只能读取1024个,所以我写了下面代码测试一下
(有兴趣的朋友可以测试一下(●'◡'●))
1 //测试gets最多读取字符是否超过1024 2 #include <stdio.h> 3 #include <string.h> 4 5 int main() 6 { 7 char str[2048]; //听说gets最多可以读取1024个字符,我们设定一个2048的数组 8 gets(str); //从键盘输入大于1024个字符 9 int cnt; 10 printf("cnt = %d", strlen(str)); //cnt的值就是数组元素个数,是否大于1024呢??? 11 12 return 0; 13 }
经本人亲自测试第一次cnt = 2003,第二次cnt = 2086,第二次程序最后崩溃了,但是不能说明gets的读取上限为2086左右,
因为程序崩溃是由于内存越界
2,在来细说一下fgeis的用法,我们以char str[N];fgets(str, N, stdin);为例:
fgets只能读取N-1个字符,包括最后的' ',读完结束后系统将自动在最后加' '(gets读完结束后系统自动会将' '置换成' ')。
说到这里就有俩种情况了:
一:当你从键盘上输入<=N-1个字符(包括' ')时,那么字符串str会以‘ ’结尾。这就造成了strlen(str)比你想象的大 1 ,
当然你可以通过下面代码将' '去掉。
1 if(str[strlen(str) - 1] == ' ') { // 去掉换行符 2 str[strlen(str) - 1] = '