C 中的二进制到十进制转换程序没有像预期的那样工作,而是提供一些随机输出



程序应该请求二进制数组的长度和个数,然后存储它们并将它们全部转换为十进制并打印十进制部分。逻辑对我来说似乎很好,但由于某种原因它不起作用,并给出奇怪的输出。下面是代码:

#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("%in", deci[i]);
}
}  

我发现这个程序有几个问题。首先,以您的方式创建数组会给大多数编译器带来错误。通过包含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重命名。

此外,我在第一个循环中使用%iscanf调用也遇到了问题,所以我将其更改为%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("%in", base10_nums[i]);
}
free(binary_nums);
free(base10_nums);
}
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]);
}
}

最新更新