如何解决此代码(在c中使用char将二进制转换为十进制)?

时间:2019-07-09 11:07:13

标签: c binary

为什么此代码不起作用? (我想将数字从二进制转换为十进制) 指针有问题吗?或乘法(char * int)

char cara[100];
char *t=cara;
int i=0;
int sum=0;
int j=0;
int m;

printf("entrer a binary number\n");
scanf("%s",&cara);
while(*t!="\0")
{
    j++;
    m=j-1;
}


for(i=0;i<j;i++)
{
    cara[i]=cara[i]*pow(2,m);
    m--;
}
int k;
for(k=0;k<j;k++)
{
    sum=sum+cara[i];
}
printf("%d",sum);
}

1 个答案:

答案 0 :(得分:2)

第一个错误在这里:

while(*t!="\0")

您必须对字符使用单引号-如while(*t!='\0')。为了简化起见,您只需编写while(*t)

除此问题外,还请注意您从不更新 t。您需要在循环内添加++t;

第二个错误在这里:

cara[i]=cara[i]*pow(2,m);

字符'0''1'具有整数值零和一,因此计算错误。字符'0'的整数值为48,字符'1'的整数值为49(请参见https://da.wikipedia.org/wiki/ASCII),因此结果将完全错误。

要使计算更正确,您需要:

cara[i] = (cara[i] - '0') * pow(2,m);

但是,将这些中间结果保存回char中是一个坏主意char的值不能大于127(如果char是无符号的,则不能为255),因此您很快就会出现整数溢出。

通常不需要保存这些中间结果,也不需要pow,因为您只需将每个二进制数字乘以2。

尝试这样:

#include <stdio.h>

int main(void) {
    char *bin_str = "11001";
    unsigned result = 0;
    while (*bin_str)
    {
        result *= 2;
        result += *bin_str == '1' ? 1 : 0;
        ++bin_str;
    }
    printf("%d\n", result);
    return 0;
}