在 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

此外,我在第一个循环中使用%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);

【讨论】:

【参考方案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 中进行二进制到十进制转换的程序没有像预期的那样工作,而是给出了一些随机输出的主要内容,如果未能解决你的问题,请参考以下文章

任意十进制数转换成ASCII码C语言程序

请设计一个数制转换的C语言源程序

请用Python语言编程实现由十进制数到二进制数的转换。

在c++中编写一个程序实现进制转换。

Sum 十进制数据类型 SwiftUI CoreData

在 C/C++ 中高效地在十六进制、二进制和十进制之间进行转换