打印从C中的函数返回的字符数组

时间:2015-02-22 16:24:46

标签: c arrays printf

我是C语言的新手,请原谅我的初学者问题。

#include<stdio.h>
#include<stdlib.h>

char *decimal_to_binary(int);

void main() {
    int buffer;

    while (1) {
        printf("Type your number here: \n\r");
        scanf_s("%d", &buffer);
        printf("After conversion to binary system your number is: \n\r");
        printf("%s", decimal_to_binary(buffer));
        printf("\n");
    }
}

int get_byte_value(int num, int n) {
    // int x = (num >> (8*n)) & 0xff
    return 0;
}

char* decimal_to_binary(int num) {
    int tab[sizeof(int) * 8] = { 0 };
    char binary[sizeof(int) * 8] = { 0 };
    int i = 0;

    while (num) {
        tab[i] = num % 2;
        num /= 2;
        i++;
    }

    for (int j = i - 1, k = 0; j >= 0; j--, k++) {
        binary[k] = tab[j];
    }

    return binary;
}

当我打印出来自decimal_to_binary的任何内容时,我会得到一些垃圾(一个笑脸字符)而不是二进制表示。但是当我在printf函数的最后一个循环中decimal_to_binary时,我得到了正确的值。那我做错了什么?

1 个答案:

答案 0 :(得分:1)

char binary[sizeof(int) * 8] = { 0 };

是一个局部变量声明,你不能返回它。

您需要使用堆从函数返回一个数组,因为您需要malloc()

char *binary; /* 'binary' is a pointer */
/* multiplying sizeof(int) will allocate more than 8 characters */
binary = malloc(1 + 8);
if (binary == NULL)
    return NULL;
binary[sizeof(int) * 8] = '\0'; /* you need a '\0' at the end of the array */
/* 'binary' now points to valid memory */

接下来,作业binary[k] = tab[j];可能不是您的想法

binary[k] = (char)(tab[j] + '0');

可能就是你想要的。

note :c中的字符串只是一个字节序列,终止'\ 0'。

修复此问题后,您还需要修复main(),立即执行此操作

printf("%s", decimal_to_binary(buffer));

是错误的,因为decimal_to_binary()可以返回NULL,并且因为你需要在返回后释放缓冲区,所以

char *binstring = decimal_to_binary(buffer);
if (binstring != NULL)
    printf("%s", binstring);
free(binstring);

另外,请注意您只计算8位,因此decimal_to_binary的适当签名将是

char *decimal_to_binary(int8_t value);