2016-10-26 35 views
0

此功能是串表示二進制轉換爲字符串表示十六進制爲什麼我把這個函數調用了8次,所有的結果都是上次的?在C

char *tohex(char bnyin[32]) { 

static char hexout[8]; 

int i=0; 
int j=0; 

for (i=0;i<8;i++){ 

    char txt[4]; 
    char hex; 

    txt[0] = bnyin[i*4+0]; 
    txt[1] = bnyin[i*4+1]; 
    txt[2] = bnyin[i*4+2]; 
    txt[3] = bnyin[i*4+3]; 

    switch (atoi(txt)) { 
     case 0:  hex = '0'; break; 
     case 1:  hex = '1'; break; 
     case 10:  hex = '2'; break; 
     case 11:  hex = '3'; break; 
     case 100:  hex = '4'; break; 
     case 101:  hex = '5'; break; 
     case 110:  hex = '6'; break; 
     case 111:  hex = '7'; break; 
     case 1000:  hex = '8'; break; 
     case 1001:  hex = '9'; break; 
     case 1010:  hex = 'a'; break; 
     case 1011:  hex = 'b'; break; 
     case 1100:  hex = 'c'; break; 
     case 1101:  hex = 'd'; break; 
     case 1110:  hex = 'e'; break; 
     case 1111:  hex = 'f'; break; 
    } 
    hexout[i] = hex; 
} 
return hexout; 
} 

主函數調用tohex功能8倍

int main (int argc, char**argv) 
{ 
char *dl_hex[8]; 
char dl_bny[8][32]; 

for (i=0;i<8;i++) { 
    dl_hex[i] = tohex(dl_bny[i]); 
} 
} 

for (i=0;i<8;i++) { 
    for (j=0;j<8;j++){ 
     printf("%c",*(dl_hex[i]+j)); 
    } 
     printf("\n"); 
} 

打印出所有dl_hex後,所有的結果都具有相同的dl_hex [7],如果我將循環次數改爲6次,所有結果都是dl_hex [5],似乎無論我調用tohex函數多少次,所有結果都會進入最後一次。

+0

歡迎堆棧溢出。 請注意,在這裏說'謝謝'的首選方式是通過 提高投票的好問題和有用的答案(一旦你有足夠的聲譽這樣做),並接受任何 問題最有用的答案,你問(這也給你一個小小的提升,以你的聲望 )。 請參閱[關於]頁面,以及[如何在此處提問 ?]和 [當有人回答我的 問題時,我該怎麼辦? ?](http://stackoverflow.com/help/someone-answers) –

回答

1

您返回一個靜態緩衝區,然後它對所有調用都是相同的,然後將包含最後生成的值。

您可以(例如)只是每次調用tohex時間複製返回結果:

char dl_hex[8][9]; 

... 

strcpy(dl_hex[i], tohex(dl_bny[i])); 

要注意的是,如果錯了,有的地方你的代碼:dl_bny未初始化,必須字符串包含最終0,所以長度應該是33 ...

+0

strcpy可能無法正常工作,因爲char數組的內容似乎不以'\ 0'結尾。 – Jay

+0

這就是爲什麼我告訴他改變一些其他的東西...... –

+0

@ Jean-BaptisteYunès謝謝你的答案,它的效果很好!雖然dl_bny是在其他地方初始化的,但是你提到的解決了我關於'\ 0'終止符的另一個問題!欣賞它! – raymondxuym

1

您正在返回一個指向功能tohex的靜態緩衝區hexout的指針。靜態緩衝區hexout的內容在每次迭代過程中保持不斷變化。因爲你基本上是將指針存儲到hexoutdl_hex的所有插槽都將包含相同的指針(至hexout),因此將包含與上次運行期間獲得的值相同的值。

最適合你的方法是複製這些值。

更改爲下面的代碼的主要功能:

int main (int argc, char**argv) 
{ 
char dl_hex[8][8]; 
char dl_bny[8][32]; 

for (i=0;i<8;i++) { 
    strncpy(dl_hex[i],tohex(dl_bny[i]), 8); 
} 
} 

for (i=0;i<8;i++) { 
    for (j=0;j<8;j++){ 
     printf("%c",*(dl_hex[i]+j)); 
    } 
     printf("\n"); 
} 
+0

感謝您的回答和解釋!我嘗試了strncpy然後我得到了正確的結果。我想知道,在第一次迭代中,爲什麼不是第一個插槽立即獲取第一個指針,然後轉到第二個迭代?對於我的情況,似乎編譯器首先調用該函數8次,然後將這8個結果分配給8個插槽? – raymondxuym

相關問題