2014-10-27 36 views
-3
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的阵列具有不同的结果

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

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

+5

您滥用了'strlen'并调用了未定义的行为。它用于测量* strings *(NUL终止字符序列)的长度,而不是任意数组。 – 5gon12eder 2014-10-27 23:14:33

回答

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 

在你很幸运与第一阵列原密码的情况下,它只是碰巧有由文字创造的最后一个元素之后的零字符。

分享和享受。

+3

也许是'unsigned char kk []'? – chux 2014-10-27 23:16:51

+1

@chux:如果意图将数组视为字符串,则仍然需要零字符作为终止符。 – 2014-10-27 23:17:56

+1

更清楚:建议'unsigned char kk []'而不是'unsigned char kk [17]'。无论哪种情况,数组都应该以空字符结尾,以使其成为字符串。 – chux 2014-10-27 23:21:39

3

strlen()对字符进行计数,直到找到'\ 0',这是您没有提供的。恰好碰巧从kk的末尾有一个'0'值为16个字节,而kkf的末尾有一个22个字节,但这完全是偶然的。

相关问题