C 中的二进制到十进制转换程序无法正常工作,而是提供一些随机输出

Program for binary to decimal conversion in C isn't working like it's supposed to and instead gives some random outputs

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

#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]);
    }
}  
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]);
    }
}

我发现此程序存在一些问题。首先,按照您的方式创建数组会给大多数编译器带来错误。这是通过包含 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("%i\n", base10_nums[i]);
    }
    free(binary_nums);
    free(base10_nums);
}