在 C 中进行二进制到十进制转换的程序没有像预期的那样工作,而是给出了一些随机输出
Posted
技术标签:
【中文标题】在 C 中进行二进制到十进制转换的程序没有像预期的那样工作,而是给出了一些随机输出【英文标题】:Program for binary to decimal conversion in C isn't working like it's supposed to and instead gives some random outputs 【发布时间】:2021-11-04 15:14:16 【问题描述】:该程序应该询问二进制数组的长度和数量,然后将它们存储并将它们全部转换为十进制并打印小数部分。逻辑对我来说似乎很好,但由于某种原因它不起作用并给出奇怪的输出。代码如下:
#include <stdio.h>
int main()
int n, decimal_num = 0, base = 1, rem;
printf ("Enter the length and number of binary strings: ");
scanf(" %i", &n);
int str[n], deci[n];
for (int i = 0; i<n; i++)
printf("Enter string %i: ", i + 1);
scanf(" %i", &str[i]);
for (int i = 0; i < n; i++)
while (str[i] > 0)
rem = str[i] % 10;
decimal_num = decimal_num + rem * base;
str[i] = str[i] / 10;
base = base * 2;
deci[i]= decimal_num;
decimal_num= 0;
for (int i = 0; i < n; i++)
printf("%i\n", deci[i]);
【问题讨论】:
我在这里没有看到任何字符串 您正在读取整数而不是看起来应该是位的内容。然后不清楚n
应该表示什么
您没有在两次转换之间将 decimal_num 设置为 0。
【参考方案1】:
我发现这个程序存在一些问题。首先,以您所做的方式创建数组会给大多数编译器带来错误。这可以通过包含 stdlib.h 和使用 malloc 动态分配数组来解决
int *str, *deci;
str = malloc(n * sizeof(int));
deci = malloc(n * sizeof(int));
这也意味着您需要在程序结束时释放此内存。
free(str);
free(deci);
第二个问题是在第二个循环中计算以 10 为底的值。这很可能是导致错误输出的原因。该问题是由于在每次循环迭代后未重置基本变量引起的。这导致程序以比实际大得多的方式解释二进制数。这可以通过在将decimal_num
设置为零的相同位置将base
变量设置回1 来解决
另一个不影响功能的问题是变量的命名。更具体地说,变量str
不存储字符串。您应该将其重命名为更具描述性的名称,例如binary_nums
。出于同样的原因,我还建议重命名 deci
。
此外,我在第一个循环中使用%i
的scanf
调用也遇到了问题,因此我将其更改为%d
,这为我解决了问题。
固定的程序是这样的
#include <stdio.h>
#include <stdlib.h>
int main()
int n, decimal_num = 0, base = 1, rem;
int *binary_nums, *base10_nums;
printf("Enter the length and number of binary strings: ");
scanf(" %d", &n);
binary_nums = malloc(n * sizeof(int));
base10_nums = malloc(n * sizeof(int));
for (int i = 0; i < n; i++)
printf("Enter string %i: ", i + 1);
scanf(" %d", &binary_nums[i]);
for (int i = 0; i < n; i++)
while (binary_nums[i] > 0)
rem = binary_nums[i] % 10;
decimal_num = decimal_num + rem * base;
binary_nums[i] = binary_nums[i] / 10;
base = base * 2;
base10_nums[i] = decimal_num;
decimal_num = 0;
base = 1;
for (int i = 0; i < n; i++)
printf("%i\n", base10_nums[i]);
free(binary_nums);
free(base10_nums);
【讨论】:
【参考方案2】:unsigned conv(const char *binaryString)
unsigned result = 0;
while(binaryString && *binaryString)
if(*binaryString == '\n') break;
result *= 2;
result += *binaryString++ == '1';
return result;
int main(void)
int size, number;
scanf("%u", &size);
scanf("%u", &number);
/* check return value of scanf */
char strings[number][size+1];
for(int n = 0; n < number; )
fgets(strings[n], size, stdin);
/* add error checks */
if(strings[n++][0] == '\n') n--;
for(int n = 0; n < number; n++)
printf("%u (0x%x) == %s", conv(strings[n]), conv(strings[n]), strings[n]);
【讨论】:
这到底应该做什么?我运行了它,但我认为这里的换行符扰乱了执行流程。在每个fgets
之后可能有一个strings[strcspn(strings, "\n")] = 0;
?
这个答案可能需要一些解释。以上是关于在 C 中进行二进制到十进制转换的程序没有像预期的那样工作,而是给出了一些随机输出的主要内容,如果未能解决你的问题,请参考以下文章