【更新】2012-7-9,增加示例
【问题描述】
看一个例子
char str[6]={'h','e','l','l','o','\0'};
printf("%d\n",strlen(str));
这个例子是求取字符串长度,结果为5。为什么不是6呢?原因是NUL('\0')不是字符串的一部分。看看字符串的定义就明白了。
【定义】字符串就是一个零串或多个字符,并且以一个位模式为全0的NUL字节结尾。NUL字节是字符串的终止符,但它本身并不是字符串的一部分。
【增-示例】
再看一个例子
#include <stdio.h>
#include <stdlib.h>
#include <QtDebug>
int main(void)
{
char str1[] = {'h','e','l','l','o'};
char str2[] = "hello";
char *str3 = "hello";
qDebug()<<strlen(str1)<<strlen(str2)<<strlen(str3);
qDebug()<<sizeof(str1)<<sizeof(str2)<<sizeof str3;
return 0;
}
运行结果如下:
8 5 5
5 6 4
【分析】
(1) strlen()求解的是字符串长度,按定义strlen(str2)为5,strlen(str3)为5,很好理解;
(2) sizeof(str1)为5,求解的是数组大小;sizeof(str2)求解的字符串长度,包括了'\0'字符,所以大小为6;sizeof str3求解的指针大小,故大小为4;
(3) strlen(str1)如何理解呢?
按字符串定义,str1根本就不是字符串。而strlen()函数求解的是字符串长度。看下述实验:
char str1[] = {'h'};
strlen(str1)长度为4;而
char str1[] = {'h','e'};
strlen(str1)长度为5,以此类推,
可以推测,该结果是编译器给出的。
*Qt 编译器采用的strlen()是ANSI C提供的版本,源码如下:
#include <string.h>
size_t
strlen(const char *org)
{
register const char *s = org;
while (*s++)
/* EMPTY */ ;
return --s - org;
}
while循环通过判断'\o'字符结束,但str1没有'\0',这时编译器做出反映,给出了一个令人匪夷所思的值8。
*注意到strlen函数的返回值是无符号数,没有负值。故类似于if(strlen(x)-strlen(y)>=0) 恒为真。切记不要用if(strlen(x)-strlen(y)>=0) 代替if(strlen(x)>=strlen(y)) 。
转载请标明出处,仅供学习交流,勿用于商业目的
Copyright @ http://blog.csdn.net/tandesir