c - 将 char * 数组中的字符串分配给另一个 char * 数组

标签 c arrays

我正在尝试将数组 a 中的十六进制值转换为二进制值,并将转换后的值分配给数组 b,然后打印数组 b。但是数组 b 中的所有值都相同。输出是:

111100001011000100010111101010001101
111100001011000100010111101010001101
111100001011000100010111101010001101

如果我使用 b[i] = strdup(hexToBin(a[i])); 而不是 b[i] = hexToBin(a[i]); 输出将是:

111100001011
111100001011000100010111
111100001011000100010111101010001101

这是关于指针的吗? Char * 是一个指针,它指向字符串的第一个字符,是否打印指针之后的所有字符?什么是正确的做法?

#include <stdio.h>
#include <string.h>

char bin[100] = "";

char * hexToBin(char  hex[50]);

int main(void) {

    char * a[] = {
        "f0b",
        "117",
        "a8d",
    };

    char * b[3];

    for(int i = 0; i < 3; i++) {
        b[i] = hexToBin(a[i]);
    }

    for(int i = 0; i < 3; i++) {
        printf("%s\n", b[i]);
    }

}

char * hexToBin(char  hex[50]) {    

    for(int i=0; hex[i]!='\0'; i++)
    {
        switch(hex[i])
        {
            case '0':
                strcat(bin, "0000");
                break;
            case '1':
                strcat(bin, "0001");
                break;
            case '2':
                strcat(bin, "0010");
                break;
            case '3':
                strcat(bin, "0011");
                break;
            case '4':
                strcat(bin, "0100");
                break;
            case '5':
                strcat(bin, "0101");
                break;
            case '6':
                strcat(bin, "0110");
                break;
            case '7':
                strcat(bin, "0111");
                break;
            case '8':
                strcat(bin, "1000");
                break;
            case '9':
                strcat(bin, "1001");
                break;
            case 'a':
            case 'A':
                strcat(bin, "1010");
                break;
            case 'b':
            case 'B':
                strcat(bin, "1011");
                break;
            case 'c':
            case 'C':
                strcat(bin, "1100");
                break;
            case 'd':
            case 'D':
                strcat(bin, "1101");
                break;
            case 'e':
            case 'E':
                strcat(bin, "1110");
                break;
            case 'f':
            case 'F':
                strcat(bin, "1111");
                break;
            default:
                printf("Invalid hexadecimal input.");
        }
    }
    return bin;
}

最佳答案

hexToBin 函数返回指向全局 bin 数组第一个元素的指针。 每次!

这意味着 b 中的所有指针都将是指向 bin 数组中相同第一个元素的相同指针。

如果您知道字符串的最大长度,我建议您将 b 设为 arrayschar 数组。例如

char b[3][500];  // 3 arrays of 499-character strings (+1 for the null-terminator)

然后不是 hexToBin 返回指向单个全局数组的指针,而是将指向要填充的字符串的指针作为参数传递给 hexToBin:

void hexToBin(char *hex, char *bin);

并将其命名为

hexToBin(a[i], b[i]);

关于c - 将 char * 数组中的字符串分配给另一个 char * 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55183975/

相关文章:

c - 函数看不到结构内部结构的字段

c++ - 增长序列的长度 C++

PHP 从逗号分隔的字符串中以逗号获取值,而不会爆炸和循环

c - 将 char 数组的第一个字符分配给另一个变量

c++ - 有没有更好的方法来初始化 C++ 中分配的数组?

PHP Unset Array 值对其他索引的影响

c - 如何检查文件描述符是否有任何可用数据?

C 中的紧凑数组

c - 如何将 KdPrint 定义为 DbgPrint?

c++ - GCC 前缀递增运算符在将值传递给函数时行为不当