为函数内的指针赋值

时间:2011-11-21 03:35:04

标签: c string binary hex

好的,我有一个问题,我猜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语句中可以清楚地看出,正确构造了二进制代码。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

这一行:

*binAddr = *value;

您认为它有什么作用?在应用星号之前,两个参数都引用字符数组或指向char的指针。因此,当取消引用时,它们每个都引用一个字符。所以这个语句指定binAddr中的第一个char等于值中的第一个char,而大概你想要返回整个字符串。

答案 1 :(得分:0)

您正在构建一个字符为'0'和'1'的字符串。你需要创建的是一系列BYTES。你需要采用unsigned int或等效的64位类型,并根据输入设置位。