`
paddy.w
  • 浏览: 497784 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C语言中strlen方法的陷阱

    博客分类:
  • C
 
阅读更多
        在用strlen时遇到挺郁闷的问题,用strlen求字符数组的长度时总是不对,google了一下才发现忽略了其中的一些细节。
int main() {
    char a[5]="AABCD";
    char b[4]="CDAA";
    int len = strlen(a);
    printf("%d\n",len);
}

        在我的机器上执行结果总是26,但明显应该是5,why?看了下strlen的源码才明白,strlen判断字符串长度时是以'\0'为界的,也即strlen碰到'\0'时才会认为字符串结束了。
        我们知道,字符串常量是以'\0'为结尾的,而上面将字符串常量“AABCD”赋给a数组时,恰恰丢掉了结尾的'\0',以至于判断到'D'的下一位发现不是'\0'进而继续判断。所以,在判断字符串常量时是不会出错的,若非要判断字符数组的长度,就需要注意了。

        这其中还有一个陷阱,看下面的语句:
int main() {
    char *s = "hello";
    int len = strlen(s);
    printf("%d\n",len);
    printf("%d\n",strlen(s)-7);
    printf("%ud\n",strlen(s)-7);
    printf("%d\n",strlen(s)>7);
    printf("%d\n",strlen(s)-7>0);
}

        在我机器上的执行结果如下:
5
-2
4294967294d
0
1

        可能在最后的两个结果有疑问,这种逻辑放在平常感觉没什么不一样,这里为什么会不一致呢?看一下strlen的原型也就明白了
size_t strlen(const char *string);

        其中在string.h中说明了size_t是在stddef.h中定义的。我机器的stddef.h中定义size_t为无符号整型,而无符号与有符号的运算结果还是无符号的。这也就解释了为什么最后一个结果判断为真,因为-2的无符号整型值大于0。
分享到:
评论
1 楼 loovejava 2012-09-01  
呵呵
最近也在看C/C++

留意这个问题了。

相关推荐

Global site tag (gtag.js) - Google Analytics