字符串长度
来源:互联网 发布:上海数据 新三板 编辑:程序博客网 时间: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
- 字符串长度
- 字符串长度
- 字符串长度
- 字符串长度
- 字符串长度
- 字符串长度
- 字符串长度
- 字符串长度
- 字符串长度
- 字符串长度
- 字符串长度
- 字符串长度
- 字符串长度
- 字符串长度
- 获取字符串长度、字符长度、字节长度
- 获取字符串长度、字符长度、字节长度
- 【字符串】字符串拷贝和长度
- 正则字符串长度分割字符串
- Ubuntu桌面效果无法开启的解决
- 多个数据源,动态切换
- Hibernate的状态
- load与get的区别
- 怎样花两年时间去面试一个人 (转)
- 字符串长度
- iPhone 制作 AdHoc 发布应用测试版的方法
- 见过这些图 才明白什么叫坐井观天!
- XenServer 6.0 上安装NFS 之 分区篇
- hibernate是如何延迟加载的
- 局部变量的默认值的问题
- 本机代码(native code)和托管代码 (managed code)
- Jlink 下载程序到SDRAM运行
- Android之PopuWindow简单学习