我有STR:Ç - 字符到六
char *str = "lala";
現在,我想在STR轉換任何字符爲十六進制,例如:
str = convert(str);
print str: 0x6C 0x61 0x6C 0x61
^l^a^l^a
我可怎麼辦呢?
我有STR:Ç - 字符到六
char *str = "lala";
現在,我想在STR轉換任何字符爲十六進制,例如:
str = convert(str);
print str: 0x6C 0x61 0x6C 0x61
^l^a^l^a
我可怎麼辦呢?
char* x = str - 1;
while(*++x) printf("%02x ", (int) *x); // Print one character in hex
printf("\n") // Finish with a carriage return
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;
}
可能會錯過一些東西,沒有使用下八年。
只問printf的做到這一點:
void convert(char* str, size_t length) {
size_t i;
for(i = 0; i < length; i++)
printf("0x%02x ", str[i]);
}
您可以使用此實現實現它....
#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;
}
緩衝區溢出的潛力:'sprintf()'會寫入'0xNN \ 0',所以如果長度爲2,那麼它將分配10個字節,但它會寫'0xNN 0xNN \ 0'(11字節)。除此之外,很好地完成:) –
for循環不會將空字符寫入緩衝區。語句hexStr [ - j] ='\ 0';在最後一個空格字符處寫入空字符。所以,不應該發生緩衝區溢出。 – abhiarora
'sprintf()'函數總是寫入一個空字符。從C標準:除了輸出寫入數組(由參數指定)而不是寫入流之外,'sprintf'函數等同於'fprintf'。在寫入字符的末尾寫入空字符; ...因此,當您使用'sprintf()'向緩衝區寫入5個字符時,您還在末尾寫入第6個字符:空字符。 –
這個代碼是未定義行爲。指針運算只在*數組內有效*(包括一次性結束指針)。 (然後,我希望人們停止使用增量子表達式,只是爲了炫耀他們「知道C」。) –
可以使用'char * x = str; while(* x)printf(「%02hhx」,* x ++);'並避免最初的'str-1'。 '(int)'沒有用處。 – chux
@KerrekSB在這個問題中,'str'指向一個字符數組。在我的回答中,'x'在不改變'str'的情況下迭代該數組。當它指向'str'的邊界之外時,'x'不會被解引用。 – Logicrat