在C中返回字符指针数组

时间:2015-10-29 13:21:18

标签: c pointers

我使用下面的函数将Decimal转换为二进制

char** DEtoBinary(char HexDE[])
{
    printf("HexDE = %s\n", HexDE);
    int I;
    char* deBinary[16];
    for (I = 0; I <= 15; I++)
    {
        //deBinary = deBinary + Hex2Binary(HexDE.Substring(I, 1));
        deBinary[I] = strcpy(deBinary, Hex2Binary(substring_added1(HexDE, I, 1)));

    }
    printf("deBinary = %s\n", deBinary);
    return deBinary;

}

十六进制到二进制函数

char *Hex2Binary(char* DE)
{
    printf("Inside DE = %s\n", DE);

    char *myBinary;
    long val = strtol(DE, NULL, 16);

    switch(val)
    {
        case 0:
         myBinary = "0000";
         break;

        case 1:
         myBinary = "0001";
         break;

        case 2:
         myBinary = "0010";
         break;

        case 3:
         myBinary = "0011";
         break;

        case 4:
         myBinary = "0100";
         break;

        case 5:
         myBinary = "0101";
         break;

        case 6:
         myBinary = "0110";
         break;

        case 7:
         myBinary = "0111";
         break;

        case 8:
         myBinary = "1000";
         break;

        case 9:
         myBinary = "1001";
         break;

        case 10: //A
         myBinary = "1010";
         break;

        case 11: //B
         myBinary = "1011";
         break;

        case 12://C
         myBinary = "1100";
         break;

        case 13://D
         myBinary = "1101";
         break;

        case 14://E
         myBinary = "1110";
         break;

        case 15: //F
         myBinary = "1111";
         break;

    }
    printf("myBinary = %s\n" ,myBinary);
    return myBinary;
 }

在Hex2Binary函数中, myBinary正常返回,但我需要将整个二进制转换后的字符串发送到char * DEtoBinary的原始调用者(char HexDE [])

原始来电者

de1Binary = DEtoBinary(DE[0]);

实施例 我的DE [0] = E234567787888888

预计是111000100011 ........... 但我只得到最后一个十六进制值的二进制值,即8是1000

2 个答案:

答案 0 :(得分:0)

我仍然看错的几件事是::

deBinary[I] = strcpy(deBinary, Hex2Binary(substring_added1(HexDE, I, 1)));

您再次将char*复制到char**这不是一个好主意。也许你会尝试像::

这样的东西
strcpy(deBinary[I], Hex2Binary(substring_added1(HexDE, I, 1)));

检查这个:: strcpy() return value

所以,我认为没有必要保存strcpy返回的值。

此外,在您的打印声明中打印

printf("deBinary = %s\n", deBinary);

其中deBinary又是char**:P 但是,根据我的理解,它只打印前4个二进制数字是因为它在第一个二进制表示的末尾遇到\0

所以,你可能会尝试做::

for(int i = 0; i < 16; i++) {
    printf("%s ", deBinary[i]);
}

这可能实际上解决了你的问题。

此外,在您的代码中,您声明了类似这样的内容char* deBinary[16];,这是一个16 char*的数组,用于存储16个char数组的地址,但实际上是您使用strcpy将从Hex2Binary返回的字符串复制到deBinary[i]指向的位置,该位置尚未分配任何内存,因此您将字符复制到您从未分配的内存中,这是一个坏主意(但可能适用于您的设备),因此建议您将deBinary声明为char deBinary[16][5],或者不要使用strcpy,而只需复制{{}返回的地址1}}喜欢

Hex2Binary

因为据我所知,当你向deBinary[i] = Hex2Binary( ... ); 声明分配给常量内存的"1100"时,可能会有效。 (我不确定这一点,如果有人可以对此发表评论并帮助它会很棒)。

我希望这可以提供帮助!

编辑::

此外,再次谈论char*,你在本地声明了一个deBinary[]并从函数返回它,这是错误的,因为在函数调用结束后,所有声明的变量都被废弃了函数调用从堆栈中移出!因此,如果您不需要char**中的转换数组,则可以尝试将函数类型更改为main。或者,尝试动态分配void或者在deBinary中分配自身,并将其作为参数传递给函数main

答案 1 :(得分:-1)

您对char *char **感到困惑; Hex2Binary(char*)的返回类型为char **,但您返回char *; DEtoBinary(char[])的返回类型为char *,但您返回char **;

记住:

char *valchar valp[]相同;

char *val[]char **val相同;