2014-10-27 75 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個字節,但這完全是偶然的。

相關問題