打印从 C 函数返回的字符数组
Printing array of characters returned from function in C
本人是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 返回的任何内容时,我得到了一些垃圾(笑脸字符)而不是二进制表示。但是当我在 decimal_to_binary
函数的最后一个循环中执行 printf
时,我得到了正确的值。那我做错了什么?
这个
char binary[sizeof(int) * 8] = { 0 };
是局部变量声明,不能return那个。
您需要使用堆从函数中 return 一个数组,为此您需要 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] = '[=11=]'; /* you need a '[=11=]' at the end of the array */
/* 'binary' now points to valid memory */
接下来的作业binary[k] = tab[j];
可能不是你想的那样
binary[k] = (char)(tab[j] + '0');
可能就是您想要的。
注意: c 中的字符串只是以 '\0' 结尾的字节序列。
修复此问题后,您还需要修复 main()
,现在就这样做
printf("%s", decimal_to_binary(buffer));
是错误的,因为 decimal_to_binary()
可以 return NULL
,并且因为你需要在 returned 之后释放缓冲区,所以
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);
本人是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 返回的任何内容时,我得到了一些垃圾(笑脸字符)而不是二进制表示。但是当我在 decimal_to_binary
函数的最后一个循环中执行 printf
时,我得到了正确的值。那我做错了什么?
这个
char binary[sizeof(int) * 8] = { 0 };
是局部变量声明,不能return那个。
您需要使用堆从函数中 return 一个数组,为此您需要 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] = '[=11=]'; /* you need a '[=11=]' at the end of the array */
/* 'binary' now points to valid memory */
接下来的作业binary[k] = tab[j];
可能不是你想的那样
binary[k] = (char)(tab[j] + '0');
可能就是您想要的。
注意: c 中的字符串只是以 '\0' 结尾的字节序列。
修复此问题后,您还需要修复 main()
,现在就这样做
printf("%s", decimal_to_binary(buffer));
是错误的,因为 decimal_to_binary()
可以 return NULL
,并且因为你需要在 returned 之后释放缓冲区,所以
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);