char str2[]={“”1″”,””\0″”,””2″”};
char str3[]=”1\02″;
char a[]=”a0\0a0\0″;
printf(“%d\n”,sizeof(str1));//10
printf(“%d\n”,strlen(str1));//9 ,为什么不是1?不是已经遇到\0了么?
printf(“%d\n”,sizeof(str2));//3 这个怎么是3,而不是4? printf(“%d\n”,sizeof(“123”));结果是4
printf(“%d\n”,strlen(str2));//1 这个怎么就是1
printf(“%d\n”,sizeof(str3));//3
printf(“%d\n”,strlen(str3));//2 //这个怎么就不是1了?
printf(“%d\n”,sizeof(a));//7 这个怎么是7
printf(“%d\n”,strlen(a));//2 这个遇到\0结束可以理解
后面是输出的结果,麻烦大家给说说为什么数值是这样的。
1 有两个\, 就算一个\0也要小心, 后面跟数字默认是八进制
2 str2是数组, “123”类型是const char *
3 第二个字节就是0
4 数组
5 \0后跟数字代表八进制
6 数组
所以 字符串是 【\ ,0 ,3,1,8,”,a,s,b】 这9个字符 \0 是一个字符。 值为 0
原因是已经 转义了一次了 这个 \ 不再能够转义别的字符了。
\02,是8进制转义字符 \02 =2 ,
转义字符 遇到数字要特别注意,,,遇到字母,有时候也要仔细考察
\a,\b 也都是转义字符
写成 “abcd\0″”2xyz”
这样两个 中间的引号会被忽略,原因是两个字符串字面值,连续写(中间有空格)代表他们的连接
输出的时候是 abcd
继续输出可以输出2xyz
char str1[]=”\0318″asb”;
char str2[]={“”1″”,””\0″”,””2″”};
char str3[]=”1\02″;
char a[]=”a0\0a0\0″;
printf(“%d\n”,sizeof(str1));
//sizeof()是计算数组大小,这个代码内,数组存放应该是这样 \,0,3,1,8,”,a,s,b,\0;结果应为10;
printf(“%d\n”,strlen(str1));
//strlen()是计算字符串,但不会算\0,因此会是结果会是9
printf(“%d\n”,sizeof(str2));
//这个存放时是以字符形式存放的,后并没有0,因此它的结果应该是3.
printf(“%d\n”,sizeof(“123”));
//这段代码,本人理解的不是很透说得不对的话,高手们可以指正一下,但不要光拍砖,不来干货,首先123是字符串,他会以字符串的形式存放在常量区,而这样交给sizeof(),这个字符串在常量区的首地址,所以说”123″加上\0,一共会有4个字符,这里会是,4
printf(“%d\n”,strlen(str2));
//这里就好理解了,strlen,遇到\0会给束,而字符数组内\0也就是第二个字符,就会结束,而且不计算\0,因此这里应该是1;
printf(“%d\n”,sizeof(str3)); //”1\02″;
//数组的存放模式应该是,1,\0,2, \0因此这里是3
printf(“%d\n”,strlen(str3));// “1\02”;
//这里原因是第二个字符是 \0,这里应该输出1
printf(“%d\n”,sizeof(a));// “a0\0a0\0”;
//字符串在内存中的存放 a,0,\0,a,0,\0,\0,应此这里应输出 7
printf(“%d\n”,strlen(a));// “a0\0a0\0”;
//第3个元素是\0,应此这里是2;