fgets():
该函数的原型定义为 char *fgets(char *buf, int bufsize, FILE *stream)
fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间,直到
1出现换行字符
2读到文件尾
3已读了size-1个字符为止
最后会加上NULL作为字符串结束。
fgets()若成功则返回buf指针,返回NULL则表示有错误发生
strlen():
函数原型是size_t strlen(char const *string )
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值
这列介绍strlen是因为我们需要用他来验证一些fgets的一些情况,同时也以它的返回值来 来提醒大家注意对这类函数的返回值的处理。我们会面再说它。
回到fgets的 三种情况
1:
出现换行符 就是读到了换行符标志(在linux中为'\n',回车键) 比如一个文件的内容为
abc
def
我们以 ASCII格式查看他的内容:
0000000 a b c \n d e f \n
0000010
我们看到c 和f 后面都有一个'\n',这就是linux中的换行符
回到正题,既然fgets读到了换行符,那么换行符就也被也添加到了buf 指向的内存,然后后面再添加一个NULL。
比如 我从标准 输入 我调用 fgets(buf,10,stdin) 从标准输入获取数据放到buf中(最多获取9个)
6 fgets(buf,10,stdin)!=NULL)
7 printf("%s",buf); //注意这里没有添加换行符 printf("%s\n",buf);
8 printf("%s\n","aaaa");
,但是我只输入3个数据,然后按下回车键,我们看下数据的输出
feng@ubuntu:~$ ./a.out
def
def
aaaa
feng@ubuntu:~$
我们输入 def 然后 输出def 注意我们的printf("%s",buf);中并未在结尾添加换行符,但输出的def 却自动换行了,也就是说如果在未读取到我们要求的大小时(我们要求读的是10但只输入了3个字符),遇到了换行符(比如按下回车键),那么fgets()读取到的数据就是 已经读到的数据(遇到换行符前的数据)+换行符+NULL
我们也可以用strlen 来验证一下
6 fgets(buf,10,stdin)!=NULL)
7 printf("%s",buf);
8 printf("count:%d\n",strlen(buf));
输出情况如下:
feng@ubuntu:~$ ./a.out
def
def
count:4
feng@ubuntu:~$
strlen会计数知道遇到'\0'(‘\0’不在计数范围内),我们输入的数据只是 def (输出也是),但却统计有4个数据,这就说明,换行符也被存储进了buf中。
2:
读到文件尾就好理解了,一个文件内容为
abc
def
读def后便遇到文件结尾符。fgets变会返回。如果文件结束字符(通常为ctrl+D)为行的第一个字符时,full会返回一个NULL指针
比如
9 if(fgets(buf,sizeof(buf),stdin)!=NULL)
10 printf("a\n");
11 else
12 printf("b\n");
输出为:
feng@ubuntu:~$ ./a.out
i
a
feng@ubuntu:~$ ./a.out
b
第二次 我们是直接从键盘输入ctrl+D 于是fgets()返回NULL。
3:
读取了 size-1 个字节。
fgets()的出现就是为了避免gets()会导致溢出的问题。 如果限定了可以接受的最大字数,那么便能避免由于输入造成的溢出。所以fgets()最多只会接受size-1个字符
9 fgets(buf,10,stdin);
10 printf("%s\n",buf);
输出为
feng@ubuntu:~$ ./a.out
123456789123456
123456789
feng@ubuntu:~$
可以看到 输出被截断了。
现在我们来说下strlen()
strlen()函数返回的size_t类型,他是一个无符号整数类型。
这就带来了一些需要注意的问题。
比如
1 if( strlen(str1) >= strlen(str2) )......
2 if( strlen(str1) - strlen(str2) >= 0)......
你可能会觉得这两句没有区别,但事实上,他们的完全不一样!
第一个 if 能够正常工作,但是第二个就不能了,因为strlen()的返回值是 无符号整型值所以 >= 左边的整个式子的结果就是 无符号整型的。也就是说 第二个if 的
结果永远都为真,(无符号数不可能大于0)。
阅读(2677) | 评论(1) | 转发(0) |