字符串长度

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

 

 



 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值