2013-06-12 62 views
0

我正在寫一個十六進制到的base64編碼器作爲一個練習,因爲我是新來的C.沒關係爲什麼代碼不工作,我希望它的樣子,爲什麼我得到這些克拉字母連擊未來到我的輸出?C爲什麼輸出這些克拉?

const char * hex_to_base64(const char * s) { 
    int i; 
    for(i = 0; i < strlen(s)/3; i = i + 3) { 
    char str[3]; 
    str[0] = s[i]; 
    str[1] = s[i+1]; 
    str[2] = s[i+2]; 
    printf("%s\n", str); 
    } 
    return NULL; 
} 

int main() { 
    const char * x = "4453def6d206b696c6c696e6720796f757220627261696e206c696b652061222226f789436f6e6f5573206dabb7368726fa4b2"; 
    hex_to_base64(x); 
    return 0; 
} 

而且我得到這樣的輸出:

445 
3de^C 
f6d^F 
206 
b69^L 
6c6^O 
c69^R 
6e6^U 
720^X 
796^[ 
f75^^ 
722! 

有人能解釋爲什麼我在printf的結束得到克拉字母連擊?

+0

這些必須是控制字符的十六進制代碼。 – squiguy

+0

我認爲你的循環在任何情況下都是有缺陷的。如果's'長度爲30個字符,'i'從'0'到'3'到'6'到'9'到'12',循環結束。 –

回答

3

你傳遞一個非0結尾的字符串的printf()。更改:

char str[3]; 

char str[4]; 
str[3] = '\0'; 

更妙的是,移動的聲明和外循環零分配。

1
char str[3]; 
str[0] = s[i]; 
str[1] = s[i+1]; 
str[2] = s[i+2]; 
printf("%s\n", str); 

str應以空終止。你必須改變str聲明:

char str[4] = {0}; 
0

其他人已經指出,在程序中的錯誤,但你的問題是:「爲什麼我收到了克拉字母連擊」,並且這個問題的答案是,脫字字母組合是各種終端的代表非打印字符,您試圖打印(由於上述錯誤)。

+1

我不認爲這是真的。以這種方式輸入到終端的程序輸出不是後處理。如果終端處於烹飪模式,這僅適用於用戶輸入的回顯。我認爲在OP系統上'str [2]'後面的內存位置必須包含一個實際的'^'字符。 – Celada

+0

然後,這是一個非常一致的放置隨機存儲器的'^'符號。以這種方式表示非打印字符的另一種方式是如果輸出被重定向到文件,並且正在使用vi查看文件。 –

+0

嗯,每次都是一樣的調用堆棧,這意味着它每次都是相同的內存位置,所以也可能是相同的內容。但是關於輸出被重定向的好處。 – Celada