2010-05-28 25 views
-1

我想用c編碼hex8中的一個字符串。該腳本我有現在的問題是:如何做c中的hex8編碼?

int hex8 (char str) { 
str = printf("%x", str); 
if(strlen(str) == 1) { 
    return printf("%s", "0", str); 
} else { 
    return str; 
} 
} 

在這個函數中,我將需要添加一個0領先的字符串,如果長度小於1。我不知道爲什麼我越來越:

傳遞參數的「strlen的」 1使指針從整數沒有投

有誰知道爲什麼嗎?

回答

1

參數str是一個char。 strlen需要一個char const *參數。從上下文看,你似乎需要將原型更改爲char * str。

編輯:您還需要將函數返回類型更改爲char *。

2

第二行是一個問題:

str = printf("%x", str); 

printf輸出文本stdout,並返回表示其輸出,而不是實際值已打印的字符數的整數。此時應更換與呼叫這一行sprintf相反,輸出端負載爲str

sprintf(str, "%x", str); 

你可以閱讀有關各種標準輸出功能在這裏:Formatted Output Functions

注意sprintf返回字符數它存儲到str,這樣你就可以使用這種檢查是否需要添加0,而是採用strlen可言,像這樣:

if (sprintf(str, "%x", str) == 1) 
{ 
... 
+1

除了'的sprintf(STR,「%X」,STR)'會嘗試將結果存儲在'(char *)str'指向的位置,但'str'的​​類型爲'char'。 – nategoose 2010-05-28 22:55:00

2

我不知道究竟是什麼hex8編碼,但它看起來像你試圖把一個char變成一個雙字節的十六進制字符串?在這種情況下,你不需要像在那裏那樣複雜的任何東西。剛做這樣的事情:

char hexstring[3]; 
char character = 'f'; 

sprintf(hexstring, "%02x", character); 

的代碼片段後,hexstring"66"。如果你有一個整個字符串,這樣的事情應該工作(假設你已經分配適當的內存調用函數之前):

void string2hex(char *hex, char *in) 
{ 
    while (*in) 
    { 
     hex += sprintf(hex, "%02x", *in); 
     in++; 
    } 
} 
+0

我用「解釋他的解決方案中遇到的問題」來解決問題,但我認爲「向他展示正確的方式」並不錯。 :b – 2010-05-28 21:35:46

+0

只要'str'是一個以空字符結尾的字符串,就可以很容易地確定需要將字符串存儲爲十六進制的字符串的長度,方法是'size_t hex_str_len = 1+(2 * strlen(str)); – nategoose 2010-05-28 22:58:28