如下字符数组or字符串,用strlen函数求长度各是多少?

char * p = "abc" 与 char a[] = "abc"两种形式并不同,这在我另一篇博文中有提到。

  1. char * str1 = "abc";
  2. char * str2 = "ab\0c";
  3. char * str3 = "ab\\0c";
  4. char * str4 = "abc0c";
  5. char arr0[5] = {'1', '2', '3', '4', '5'};
  6. char arr1[5] = {'1', '2', '3', '4', '\0'};
  7. char arr2[5] = {'1', '2', '3', '4', 0};
  8. char arr3[5] = {'0', '0', '0'};
  9. char arr4[5] = {0, 'a', 'b'};
  10. char arr5[5] = {'a', '\0', 'b'};
  11. char arr6[5] = {'a', 0, 'b'};

答案为 3 2 5 5未知4 4 3 0 11

当然sizeof(arrx)  x代表0 - 6 的结果都为5

sizeof(arrx[y]) x为0 - 6.  y为 0 - 4都为1.

sizeof(strx) x为 1 - 4都为4.(32为平台下,指针大小为4字节)

为什么呢? 首先,在字符串中‘\0’代表空字符,‘\0’ASCII值为0.  所以可认为‘/0’ == 0.

strlen函数工作机理:函数从第一个字符开始计算字符串中字符数,直到遇到空字符,然后返回空字符前字符总个数。

接下来分析:

char * str1 = "abc";

3    字符串"abc",没什么好说的,系统自动在末尾加上空字符。 所以为3.

char * str2 = "ab\0c";

2    第一个字符串"abc"相当于 "abc\0",既然系统识别出了最后的空字符,说明系统把‘\0’当成一个整体,一个字符'\0'。而不是按照'\'与'0'两个字符对待。 所以遇到ab后的‘\0’时,strlen函数认为已经到了字符串的结尾。

char * str3 = "ab\\0c";

5 此时第二个斜杠被第一个斜杠转义,“\\0“相当于字符'\\'(第二个'\'被第一个'\'转义为“打印” '\' 而不是把第二个 '\' 当成一个 转义字符 和 0 合为'\0')与字符'0'。

char * str4 = "abc0c"

5  虽然说过 '/0' == 0 可在这里, 字符串中0, 代表字符'0' 而不是数字0. 因此不终止strlen计算个数。

char arr0[5] = {'1', '2', '3', '4', '5'};(这是一个字符数组,他里面存放的并不是字符串(无'\0'),只是一系列字符)

因为最后无空字符,所以strlen一直寻找直到遇到第一个空字符,此时结果不可预知(幸运的是,内存中'\0'还是蛮多的)

char arr1[5] = {'1', '2', '3', '4', '\0'};

4 因为第五个元素为'\0'

char arr2[5] = {'1', '2', '3', '4', 0};

4 因为数字0 == ‘\0’

char arr3[5] ={'0', '0', '0'};

3  前三个元素为字符‘0’ != 数字0 ('\0'),因为部分初始化,数组剩下元素被设置为数字0,因此第四个元素为0 == ‘\0’。终止,所以为3.(数组声明后不初始化,里面值为随机值,部分初始化后,未被初始化部分自动被初始化为0)

char arr[4] = {0, 'a', 'b'};

0

char arr[5] = {'a', '\0', 'b'}

1

char arr[6] = {'a', 0, 'b'};

1

我们再来看看"abc\0d"这个字符串,系统在d字符后还加空字符吗? 它里面已经有空字符了啊!?

系统还是会加的,因为系统只负责在引号中最后一个字符结尾加一个空字符,然后根据你占用的空间大小以字节为单位给字符串开辟空间,它才不管你字符串里面有没有空字符(按照约定,空字符代表字符串结束,所以平时不要在字符串内部加空字符)

我们可以通过sizeof关键字来验证,sizeof以字节为单位返回所占空间大小,包括空字符, 而strlen是计算长度直到遇到空字符停止,对他来说遇到空字符就停止工作。

如果系统在"abc\0d"末尾加空字符,那么sizeof("abc\0d")的返回值应该为6(‘\0’当一个字符对待),不加则为5。经验证为6,说明系统在最后是加空字符的(也说明了字符串中的空字符并不起终止字符串存储的作用,系统只是把'\0'当字符串中一个字符对待)。

sizeof(“abc\0”) == 5

sizeof("abc\0\0") == 6

sizeof("abc\0d") == 6

还想到一种验证方法,针对"abc\0d"实现一个函数,函数遇到第二个空字符返回包括第二个空字符在内的字符串字符总个数,即可以验证系统在这个字符串后还加没加空字符。(如果加程序返回6,如果不加则不是6,是一个随机值,or程序直接出错)。

  1. #include <stdio.h>
  2. int MyFun (const char * str);
  3. int main (void)
  4. {
  5. int n = MyFun("abc\0d");
  6. printf ("%d\n", n);
  7. return 0;
  8. }
  9. int MyFun (const char * str)
  10. {
  11. int i = 0;
  12. int flag = 0;
  13. while (1)
  14. {
  15. i++;
  16. if ( *str++ == '\0' )
  17. {
  18. flag++;
  19. }
  20. if ( flag == 2 )
  21. {
  22. return i;
  23. }
  24. }
  25. }

转自:https://blog.csdn.net/ssopp24/article/details/52893694

strlen()函数计算方法相关推荐

  1. 字符与字符串中的‘\0‘, ‘0‘, 0;strlen()函数求字符串长度计算方法(sizeof()验证)

    先问一个问题:如下字符串or字符数组,用strlen函数求长度各是多少? /*01*/char * str1 = "abc"; /*02*/char * str2 = " ...

  2. PHP strlen()函数和strpos()函数

    strlen()  函数返回字符串的长度(字符数) 代码: <?php echo strlen("Hello world!"); ?> 上面的代码将输出:12 strp ...

  3. strlen函数,strcat函数,strcpy函数,strncpy函数,strcmp函数

    strcpy函数: char *strcpy(char *Dest , const char *Src) { assert((Dest != NULL) && (Src != NULL ...

  4. strlen函数_7.2 C++字符串处理函数

    点击上方"C语言入门到精通",选择置顶 第一时间关注程序猿身边的故事 作者 闫小林 白天搬砖,晚上做梦.我有故事,你有酒么? C++字符串处理函数C语言和C++提供了一些字符串函数 ...

  5. strlen()函数 与 “\0“ 的关系 与 利用;strcmp()

    众所周知 strlen()函数是用来计算长度的; strlen()函数 与 "\0" 的关系 strlen() 在读取字符串的时候 会 一直读到 \0 处停止; 例如以下代码; 结 ...

  6. C/C++ strlen函数为什么不能传入空指针NULL?

    #include <iostream> using namespace std;int main() {int a;char *name = NULL;a = strlen(name);r ...

  7. C和指针之实现strlen函数

    1.问题 求字符串长度,实现strlen函数.           2.代码实现 #include <stdio.h> #include <assert.h>int get_s ...

  8. C和汇编---sizeof运算符和strlen函数

    sizeof sizeof是C语言的内置运算符,以字节为单位给出指定类型的大小. 程序: #include <stdio.h>int main(void) {int a=8;int b = ...

  9. C语言 strlen 函数 - C语言零基础入门教程

    目录 一.strlen 函数简介 二.strlen 函数实战 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.strlen 函数简介 ...

最新文章

  1. Scala Implicit
  2. 数据中心空调系统一种变风量节能控制策略
  3. 表格缓存问题_缓存常见问题,一网打尽哦!
  4. HDU 5308 I Wanna Become A 24-Point Master
  5. 设置springboot日志级别_Spring Boot 日志框架实践
  6. OpenGL ARB 看来终于想通了,OpenGL SDK终于要出来了。
  7. 管天管地管空气!谷歌探索用CV估算空气质量
  8. c++实现KMP算法中的Next[ ]
  9. 为什么ctrl+shift+方向键不管用了_键盘侠丨Shift键的快捷运用
  10. 【emWin】例程十:bmp图片显示
  11. Java通过BCrypt加密
  12. xp 无法关闭计算机,电脑xp系统关不了机怎么解决
  13. 小米笔记本Pro14 黑苹果失败<经验>
  14. Scientific Reports|比较转录组分析揭示了杀菌剂氰烯菌酯对尖孢镰刀菌的抗性调控机制和杀菌活性
  15. 如何设置三线表线条的粗细
  16. 台式计算机是32位还64位,电脑系统装64位还是32位系统好?考虑这些才能正确安装...
  17. 2019年1月编程语言排行榜
  18. 安卓支付宝抢红包脚本软件
  19. MuseScore入门教程(二、添加基本音乐符号)
  20. 计算机快捷键里面不显示桌面,桌面显示,显示桌面快捷键不见了

热门文章

  1. Fastadmin 权限管理
  2. 微软智力题以及参考答案
  3. 使用Email Receive端口上传文件至EDI系统
  4. 数据库设计第一范式(1NF)
  5. LaTex期刊模板下载与使用
  6. 北理工乐学C语言 49.扫雷
  7. 分布式定时任务调度中心
  8. 嵌入式软件开发培训笔记——Java第三天(方法重载、对象的构造与初始化过程分析、封装等)
  9. Android动态图标包制作教程,IT之家教程:使用安卓图标包美化Windows 10
  10. hp计算机如何进入启动界面,BIOS使用之HP BIOS篇-惠普电脑怎么进入bios