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
。
此外,我在第一个循环中使用 %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);
}
程序应该询问二进制数组的长度和个数,然后存储它们并将它们全部转换为十进制并打印小数部分。逻辑对我来说似乎很好,但由于某种原因它不起作用并给出了奇怪的输出。这是代码:
#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
。
此外,我在第一个循环中使用 %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);
}