C语言中strlen求字符串长度,求字符数组长度(空字符,数字0,字符0,数组部分初始化)
2016-10-22 17:43
316 查看
如下字符数组or字符串,用strlen函数求长度各是多少?
char * p = "abc" 与 char a[] = "abc"两种形式并不同,这在我另一篇博文中有提到。
答案为 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程序直接出错)。
char * p = "abc" 与 char a[] = "abc"两种形式并不同,这在我另一篇博文中有提到。
char * str1 = "abc"; char * str2 = "ab\0c"; char * str3 = "ab\\0c"; char * str4 = "abc0c"; char arr0[5] = {'1', '2', '3', '4', '5'}; char arr1[5] = {'1', '2', '3', '4', '\0'}; char arr2[5] = {'1', '2', '3', '4', 0}; char arr3[5] = {'0', '0', '0'}; char arr4[5] = {0, 'a', 'b'}; char arr5[5] = {'a', '\0', 'b'}; 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程序直接出错)。
#include <stdio.h> int MyFun (const char * str); int main (void) { int n = MyFun("abc\0d"); printf ("%d\n", n); return 0; } int MyFun (const char * str) { int i = 0; int flag = 0; while (1) { i++; if ( *str++ == '\0' ) { flag++; } if ( flag == 2 ) { return i; } } }
相关文章推荐
- C语言中strlen求字符串长度,求字符数组长度(空字符,数字0,字符0,数组部分初始化)
- 我的编程学习日志(10)--求字符数组与数字数组的长度(strlen,,size,sizeof)
- (1.1.19)C语言之数字、字符、字符串、数组、字符数组的关联和strcpy与memcpy的差别
- C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别
- C语言中字符数组和字符串定义和初始化的问题
- 我的编程学习日志(10)--求字符数组与数字数组的长度(strlen,,size,sizeof)
- C语言的字符数组(字符串)的定义与初始化
- 计算字符串的长度及sizeof与strlen、gets与scanf、字符数组与字符串
- 求字符数组中字符串的长度strlen(自实现)
- 字符串与字符数组初始化及长度计算
- C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别
- 关于strlen 计算未初始化的字符数组长度
- C语言中字符数组和字符串指针分析
- php中strlen及count获取字符串和数组长度的效率为常数
- C语言中字符数组和字符串指针分析
- 【C语言】字符串中的转义字符与字符串的长度
- @V@ java代码笔记2010-06-12:java控制台输入各类型类实现;以及判断输入字符串里面是否有数字的两种方法:方法1:转换成字符数组;方法2:正则表达式。
- C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别
- 获取包含中文,字母,数字集合的字符串的长度(1个汉字字符存储需要2个字节,1个英文字符存储需要1个字节)
- 【转】c语言中的字符数组与字符串