我正在嘗試創建一個將十六進制字串轉換為十六進制位元組陣列的函式。示例:str = "1c01"-> hex_bytes = { 0x1c, 0x01 }。
當我嘗試列印十六進制值時,我得到的都是 0。我認為這與我的指標有關,但我不確定。任何幫助將不勝感激。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const char *input_1 = "1c0111001f010100061a024b53535009181c";
unsigned int *str_to_hexbytes(const char *hex_str) {
size_t len = strlen(hex_str);
unsigned int *hex = malloc(sizeof(unsigned int)* len / 2);
for(int i, j = 0; i < len; i = 2, j ) {
char tmp[2];
strncpy(tmp, hex_str i, 2);
hex[j] = strtol(tmp, NULL, 16);
}
return hex;
}
int main(void) {
size_t len = strlen(input_1) / 2;
unsigned int *hex = str_to_hexbytes(input_1);
for (int i = 0; i < len; i ) {
printf("%x ", hex[i]);
}
return 0;
}
uj5u.com熱心網友回復:
tmp只有有足夠的空間來存盤您在復制兩個字符,它并沒有沒有空位元組的空間來終止字串,而事實上strncpy,因為它沒有找到一個在兩個字符它讀不會寫空位元組.
結果,strtol函式讀取陣列的末尾,觸發未定義的行為。
使tmp3 個字符長并手動添加空位元組。
此外,您只是在初始化j,而不是i,因此請確保您也這樣做。
for(int i = 0, j = 0; i < len; i = 2, j ) {
char tmp[3];
strncpy(tmp, hex_str i, 2);
tmp[2]=0;
hex[j] = strtol(tmp, NULL, 16);
}
uj5u.com熱心網友回復:
你沒有用 0 初始化 i。那可能是你的問題。int i, j = 0;僅將 j 的值更改為零, i 仍然是垃圾,因為它是從堆疊分配的。
還有幾點建議:
- 由于您也在 main 中使用字串的長度,因此您只能在 main 中計算它并將其發送給函式。
- 您使用了“malloc”,這也要求您呼叫“free”。使用完指標呼叫后
free(hex) - 迭代直到
len - 1您在 for 回圈體中使用了前面的一個記憶體塊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/384333.html
下一篇:C中的指標和地址問題
