strlen数组有不同的结果

时间:2014-10-27 23:12:33

标签: c arrays linux char strlen

unsigned char kk[16] = {129, 254, 139, 254, 135, 87, 108, 62, 203, 34, 66, 111, 142, 87, 132, 115};
unsigned char kkf[20] = {24, 165, 227, 127, 183, 90, 60, 22, 128, 165, 7, 52, 151, 238, 69, 203, 42, 213, 220, 57};
printf("strlen kk: %d\n", strlen(kk)); //should be 16
printf("strlen kkf: %d\n", strlen(kkf) //should be 20

输出

strlen kk: 16
strlen kkf: 22 //insane????????

为什么kkf [20]的长度是22?这显然是20吗?我在Linux上编译它。发生了什么?提前致谢。

2 个答案:

答案 0 :(得分:3)

C字符串是零终止的,这意味着您需要在每个数组的末尾都有一个零字符。将代码更改为:

unsigned char kk[17]  = {129, 254, 139, 254, 135, 87, 108,  62,
                         203,  34,  66, 111, 142, 87, 132, 115, 0};
unsigned char kkf[21] = { 24, 165, 227, 127, 183, 90,  60,  22,
                         128, 165,   7,  52, 151, 238, 69, 203,
                          42, 213, 220,  57,   0};
printf("strlen kk: %d\n", strlen(kk)); //should be 16
printf("strlen kkf: %d\n", strlen(kkf) //should be 20

对于原始代码,你很幸运得到了第一个数组,并且恰好在文字创建的最后一个元素之后有一个零字符。

分享并享受。

答案 1 :(得分:3)

strlen()会对字符进行计数,直到找到您未提供的' \ 0'为止。恰好有一个' \ 0'从kk结尾起16个字节,从kkf结尾起22个字节,但这纯粹是偶然的。