2016-04-10 39 views
-4

我有STR:Ç - 字符到六

char *str = "lala"; 

現在,我想在STR轉換任何字符爲十六進制,例如:

str = convert(str); 
print str: 0x6C 0x61 0x6C 0x61 
      ^l^a^l^a 

我可怎麼辦呢?

回答

-2
char* x = str - 1; 
while(*++x) printf("%02x ", (int) *x); // Print one character in hex 
printf("\n") // Finish with a carriage return 
+1

這個代碼是未定義行爲。指針運算只在*數組內有效*(包括一次性結束指針)。 (然後,我希望人們停止使用增量子表達式,只是爲了炫耀他們「知道C」。) –

+0

可以使用'char * x = str; while(* x)printf(「%02hhx」,* x ++);'並避免最初的'str-1'。 '(int)'沒有用處。 – chux

+0

@KerrekSB在這個問題中,'str'指向一個字符數組。在我的回答中,'x'在不改變'str'的​​情況下迭代該數組。當它指向'str'的​​邊界之外時,'x'不會被解引用。 – Logicrat

2
char *convert(char const *str) { 
    int len = strlen(str); 
    char *retVal = (char *)malloc(5 * len); 
    char *pos = retVal; 
    int i; 
    for(i = 0; i < len; ++i, pos += 5) sprintf(pos, i? " 0x%x" : "0x%x", str[i]); 
    retVal[5 * len - 1] = '\0'; 
    return retVal; 
} 

可能會錯過一些東西,沒有使用下八年。

2

只問printf的做到這一點:

void convert(char* str, size_t length) { 
    size_t i; 
    for(i = 0; i < length; i++) 
     printf("0x%02x ", str[i]); 
} 
0

您可以使用此實現實現它....

#define MAX 100 

char *convert(char *str) 
{ 
    char *hexStr = (char *)malloc(strnlen(str, MAX) * 5); 
    if (hexStr == NULL) 
     return NULL; 
    int i,j; 

    for (i=0, j=0; str[i]; j+=5, i++) 
     sprintf(hexStr + j, "0x%02x ", str[i]); 

    hexStr[--j] = '\0'; 

    return hexStr; 
} 
+0

緩衝區溢出的潛力:'sprintf()'會寫入'0xNN \ 0',所以如果長度爲2,那麼它將分配10個字節,但它會寫'0xNN 0xNN \ 0'(11字節)。除此之外,很好地完成:) –

+0

for循環不會將空字符寫入緩衝區。語句hexStr [ - j] ='\ 0';在最後一個空格字符處寫入空字符。所以,不應該發生緩衝區溢出。 – abhiarora

+1

'sprintf()'函數總是寫入一個空字符。從C標準:除了輸出寫入數組(由參數指定)而不是寫入流之外,'sprintf'函數等同於'fprintf'。在寫入字符的末尾寫入空字符; ...因此,當您使用'sprintf()'向緩衝區寫入5個字符時,您還在末尾寫入第6個字符:空字符。 –