注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

头文件string.h中的函数(1)  

2014-06-09 17:15:59|  分类: C & C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

string.h中的函数用于执行与C风格字符串(以’\0’结尾的字符数组)相关的操作,由于字符串的特性,该头文件还涉及到了许多内存操作的函数。这些函数包括了字符串的复制、拼接、比较、查找等,以及其他的一些操作。

1. 字符串长度

函数strlen用于计算字符串的长度,函数原型如下:

size_t strlen ( const char * str );

其中size_t是unsigned int类型。这个函数可以接受一个字符串指针,或者一个字符串数组名,测试代码如下:

#include <stdio.h>
#include <string.h>
int main()
{
    char* s1="Hello,world!";
    char s2[50]="Hello,world!";
    printf("sizeof(s1)=%d,strlen(s1)=%d\n",sizeof(s1),strlen(s1));
    printf("sizeof(s2)=%d,strlen(s2)=%d\n",sizeof(s2),strlen(s2));
    return 0;
}
程序运行的结果如下:

sizeof(s1)=4,strlen(s1)=12
sizeof(s2)=50,strlen(s2)=12

这里可以表明,sizeof(s1)实际上是指针的大小,因而是四个字节,但是对于数组s2,则是声明时的50,不过对于字符串长度,strlen都是找到’\0’的时候结束(不包括’\0’),因此两者长度相同。这个测试代码很好地阐释了为什么数组不等于指针,以及sizeof和strlen在使用时的区别。

关于strlen的使用,另一个需要说明的是返回值是unsigned int类型,因此,比较两个字符串长短的时候,使用如下代码:

char* s1="a short string";
char* s2="a very long string";    
if(strlen(s1)>strlen(s2))//Correct
    printf("LONG\n");
else
    printf("SHORT\n");
//code below is incorrect
if(strlen(s1)-strlen(s2)>0)//incorrect
    printf("LONG\n");
else
    printf("SHORT\n");
两次输出的结果分别是SHORT和LONG,显然第二个不对,原因在于,strlen的返回值是unsigned int类型,两个unsigned int类型的算术运算,其结果还是unsigned int,因此应该使用第一种方法,而不是第二种。
2.错误消息
strerr函数将错误代码转化为描述该错误的字符串,函数返回指向该描述字符串的指针首地址,函数原型如下:
char * strerror (int errnum);
测试代码如下:
#include <stdio.h>
#include <string.h>

int main()
{
    printf("%s\n",strerror(9));
    return 0;
}
这个程序是显式地显示9所对应的描述,这里是“Bad file descriptor”,这种用法并不常见,通常我们的做法是在调用一个函数之后,如果返回值不是我们所期望的,则获取其错误代码,例如像下面这样:
FILE * pFile = fopen ("NoSuchFile.dat","r");
if (pFile == NULL)
    printf ("Error occurred when opening file 'NoSuchFile.dat': %s\n",strerror(errno));
函数fopen在操作失败的时候,除了返回值为NULL之外,还会设置errno(位于头文件errno.h中)为对应的值,这个值就是strerr函数的输入值。
  评论这张
 
阅读(517)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016