字符串长度

来源:互联网 发布:上海数据 新三板 编辑:程序博客网 时间:2024/05/01 06:02

【更新】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_tstrlen(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

 

 



 

原创粉丝点击