【问题标题】:Assigning a value to a pointer inside a function给函数内部的指针赋值
【发布时间】:2012-01-02 15:58:44
【问题描述】:

好的,我有一个问题,我猜是关于 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...

最后一行(带有特殊字符)是上面 main 函数中的 printf(binAddr)。从函数内部的 printf 语句可以清楚地看出,二进制代码的构造是正确的。

我做错了什么?

【问题讨论】:

    标签: c string binary hex


    【解决方案1】:

    您正在构造一个包含字符“0”和“1”的字符串。您需要创建的是一个字节序列。您将需要采用 unsigned int 或等效的 64 位类型并根据输入设置位。

    【讨论】:

      【解决方案2】:

      这一行:

      *binAddr = *value;
      

      你认为它有什么作用?在应用星号之前,这两个参数都引用字符数组或指向 char 的指针。因此,当取消引用时,它们每个都引用一个字符。因此,此语句将 binAddr 中的第一个 char 分配为 value 中的第一个 char,而您可能想返回整个字符串。

      【讨论】:

      • 好的,那么请确保为您的 32 个字符的字符串分配 33 个字符,而不是 32 个字符。
      【解决方案3】:

      您没有为(或插入)终止值数组的空值留出空间,该值至少需要 33 个字符长。

      【讨论】:

        【解决方案4】:
        *binAddr = *value;
        

        这部分函数没有任何意义。 *binAddr 被传递到函数中,一旦函数结束,它将超出范围。您需要将要保存在 *binAddr 中的值保存在全局变量或不会超出范围的其他内容中。

        您确实有一个全局 binAddr 的事实也使问题感到困惑,因为它被本地 binAddr 隐藏了。

        【讨论】:

        • 肯定全局变量不是解决这个人问题的办法!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-16
        • 2011-10-10
        • 1970-01-01
        • 2011-01-20
        • 1970-01-01
        相关资源
        最近更新 更多