C语言的问题

char str[ ]= "0123\0456789";
printf ("%d", strlen(str)); //输出结果为9
printf ("%d", strlen(&str[5])); //输出结果为4
无法理解。

从你写的意思上看 你是想让数组存
0 1 2 3 \0 4 5 6 7 8 9 这11个元素吧
于是你期望的是 第一个输出为4 第二个输出为6
希望我理解的没错

不过 事实不以意志为转移
在C字符串中,遇到\会按照转义字符处理,而\0xx则是八进制的转义方式
所以呢
实际数组里面存的是
0 1 2 3 \045 6 7 8 9
\045被当做了一个字符 其值为8进制45 即16进制0x25 10进制37
你可以打印printf("%d", str[4]); 结果应该就是37

这样就可以理解了
第一个打印字符串总长度 9
从str[5]开始,也就是从6开始 剩下长度为4
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-07-26
0 1 2 3 \045 6 7 8 9
strlen是不会计入字符串的\0结尾符的,所以如上我分割开了的,数出来就为9个字符
显示为9
后面&str[5]这个str[5]的地址是由一些字符组成的,strlen(&str[5])计算出地址长度就为4个字节,显示为4
第2个回答  2013-07-26
str实际内容为0123%6789,百分号那里对应的ascii值为37,化为八进制就是45
在转义字符中,

\ddd 代表 三位八进制
所以\045部分变成%了,你要的字符串中的\0,只有出现在字符串末尾才能得到,如"0123\0"。
第3个回答  2013-07-26
strlen(str)传入的是指针地址,地址可以自增,\0自动去掉的

strlen(&str[5])传入的是数组地址,找到\0就结束了,默认是结束符
第4个回答  2013-07-29
\045 是八进制数45,二进制代码在ASCLL码里就是"%",只相当于一个字符。
相似回答