我正在使用除法将无符号整数转换为二进制。我有以下代码。但是,编译和执行后,我没有从程序中获得任何输出(我只是得到了换行符)。
#include <stdio.h>
/*
unsigned int is 0 or greater than 0
convert unsigned int into binary.
*/
const int ARRAY_SIZE = 100;
void reverseCharArray(char *x, int len) {
for (int end = len - 1, beg = 0; beg < end; end--, beg++) {
char temp = x[beg];
x[beg] = x[end];
x[end] = temp;
}
}
void convertWholeNumberToBinary(unsigned int x, char *result) {
int i = 0;
while (x != 0) {
result[i] = x % 2;
x = x / 2;
i++;
}
reverseCharArray(result, ARRAY_SIZE);
}
int main() {
char result[ARRAY_SIZE];
convertWholeNumberToBinary(294, result);
// 100100110
printf("%s\n", result);
return 0;
}
当输入为 294 时,期望输出为“100100110”。我期望 stdout 显示“100100110”。我知道我遗漏了一些东西,但目前我无法理解。
对于当前版本的 C(C23),使用
"%b"
你犯了一些错误,但最大的错误是当你反转你的 char 数组时。你通过了,
ARRAY_SIZE
但数组还没有完全填满,因为我们不能输入 99 位整数,所以数组末尾仍有不确定的值,这些值会被交换到数组的前面。如果数组末尾的最后一个字符恰好是 a,那么'\0'
你现在有一个以空字符结尾的空字符串要打印。相反,您想要传递
i
,它表示循环结束时字符串的实际长度。您还将
1
或添加0
到字符串中,而不是等效的字符。第三,您没有在 中初始化 char 数组
main
,因此其内容不确定。现在,由于您的其他函数没有明确地以 null 终止字符串,因此在将其打印为字符串时会遇到未定义的行为领域。简单的解决方案:使用 初始化该 char 数组""
,如果使用 C(相对于 C++)编译器进行编译,则可能不起作用。或者简单地插入空终止符
convertWholeNumberToBinary
。如果将结果以正确的顺序直接写入缓冲区以避免反转字符串,解决方案将更简单(且更快)。
当然,我们事先不知道结果的大小,但我们可以从末尾向下写入缓冲区,然后仅显示写入的部分。
写入每个数字时,需要将其从数值(0 或 1)转换为 ASCII 字符(‘0’ 或 ‘1’)以便显示。这可以通过添加 ‘0’ 来完成(ASCII 字符 ‘0’ 的数值为 48)。
由于只要数字在 0-9 范围内,此方法就有效,因此可以相当简单地将该函数推广到能够将数字转换为 2-10 范围内的任何基数。
总而言之,可以按如下方式实现:
除了已经说过的内容之外,作为初学者,也许不要想太多,而是从更简单的事情开始,例如将固定宽度整数转换为相应的二进制字符串的例程。然后您就知道确切的大小。也不需要除法或反转数组。只需一次屏蔽一个二进制数字,然后将字符从数组的末尾插入到开头。示例:
输出:
这是最基本的例子——如果你理解了这段代码,那么你就能理解练习中大部分有价值的东西。
当然,从这里开始,您可以使该代码更加高级,例如屏蔽前导零、支持不同的二进制大小、打印每个半字节/字节之间有空格的数字等等。