Chinaunix首页 | 论坛 | 博客

fx

  • 博客访问: 1346949
  • 博文数量: 115
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3964
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-02 14:36
文章分类
文章存档

2022年(2)

2019年(2)

2018年(10)

2017年(1)

2016年(50)

2015年(12)

2014年(9)

2013年(29)

分类: C/C++

2013-05-02 17:04:03

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)。







     




阅读(2631) | 评论(1) | 转发(0) |
0

上一篇:没有了

下一篇:open()函数各选项详解

给主人留下些什么吧!~~

校长的马夹2013-05-03 09:34:40

学习了,期待分享更多的博文