C语言中strlen步骤的陷阱
C语言中strlen方法的陷阱
在用strlen时遇到挺郁闷的问题,用strlen求字符数组的长度时总是不对,google了一下才发现忽略了其中的一些细节。
在我的机器上执行结果总是26,但明显应该是5,why?看了下strlen的源码才明白,strlen判断字符串长度时是以'\0'为界的,也即strlen碰到'\0'时才会认为字符串结束了。
我们知道,字符串常量是以'\0'为结尾的,而上面将字符串常量“AABCD”赋给a数组时,恰恰丢掉了结尾的'\0',以至于判断到'D'的下一位发现不是'\0'进而继续判断。所以,在判断字符串常量时是不会出错的,若非要判断字符数组的长度,就需要注意了。
这其中还有一个陷阱,看下面的语句:
在我机器上的执行结果如下:
可能在最后的两个结果有疑问,这种逻辑放在平常感觉没什么不一样,这里为什么会不一致呢?看一下strlen的原型也就明白了
其中在string.h中说明了size_t是在stddef.h中定义的。我机器的stddef.h中定义size_t为无符号整型,而无符号与有符号的运算结果还是无符号的。这也就解释了为什么最后一个结果判断为真,因为-2的无符号整型值大于0。
在用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++
留意这个问题了。
最近也在看C/C++
留意这个问题了。