好的,我有一个问题,我猜C字符串。下面是我对一些代码的修改(在对前一个stackoverflow问题的回答中给出的!),函数调用和输出。该函数将输入十六进制数(长度为8)转换为二进制数(长度为32)。
void htoi(const char *ptr, char *binAddr) {
char value[32] = "";
char ch = *ptr;
int i;
const char* quads[] = {"0000", "0001", "0010", "0011", "0100", "0101",
"0110", "0111", "1000", "1001", "1010", "1011",
"1100", "1101", "1110", "1111"};
while (ch == ' ' || ch == '\t')
ch = *(++ptr);
for (i = 0; i < 8; i++) {
if (ch >= '0' && ch <= '9')
strncat(value, quads[ch - '0'], 4);
if (ch >= 'A' && ch <= 'F')
strncat(value, quads[10 + ch - 'A'], 4);
if (ch >= 'a' && ch <= 'f')
strncat(value, quads[10 + ch - 'a'], 4);
ch = *(++ptr);
printf("%s\n", value);
}
*binAddr = *value;
}
这是我的函数调用:
char line[11], hexAddr[8], binAddr[32];
htoi(hexAddr, binAddr);
printf("%s\n", binAddr);
这是输出(当输入001133c0时):
0000
00000000
000000000001
0000000000010001
00000000000100010011
000000000001000100110011
0000000000010001001100111100
00000000000100010011001111000000
0
最后一行(带有特殊字符)是上面主函数中的printf(binAddr)。从函数内部的printf语句中可以清楚地看出,正确构造了二进制代码。
我做错了什么?
答案 0 :(得分:2)
这一行:
*binAddr = *value;
您认为它有什么作用?在应用星号之前,两个参数都引用字符数组或指向char的指针。因此,当取消引用时,它们每个都引用一个字符。所以这个语句指定binAddr中的第一个char等于值中的第一个char,而大概你想要返回整个字符串。
答案 1 :(得分:0)
您正在构建一个字符为'0'和'1'的字符串。你需要创建的是一系列BYTES。你需要采用unsigned int或等效的64位类型,并根据输入设置位。