C十六进制到十进制的转换,我不明白我的代码出了什么问题
我的代码应该在用户输入中找到十六进制数,后跟或不后跟0x,将它们作为字符串复制到数组中,并且每次找到非1-9 a-f a-f字符或EOF时,都应该执行htoi函数,将字符串中的字符转换为十进制数,从右到左,使用乘数说明位置。它没有做它应该做的。它生成的数字与我的十六进制数的十进制等价物无关C十六进制到十进制的转换,我不明白我的代码出了什么问题,c,C,我的代码应该在用户输入中找到十六进制数,后跟或不后跟0x,将它们作为字符串复制到数组中,并且每次找到非1-9 a-f a-f字符或EOF时,都应该执行htoi函数,将字符串中的字符转换为十进制数,从右到左,使用乘数说明位置。它没有做它应该做的。它生成的数字与我的十六进制数的十进制等价物无关 #include <stdio.h> #include <string.h> #include <math.h> int htoi(char num[]); int
#include <stdio.h>
#include <string.h>
#include <math.h>
int htoi(char num[]);
int main()
{
int c,i = 0;
char num[1000];
while ((c = getchar()) != EOF)
{
if ((c > '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'a' && c <= 'f'))
{
num[i] = c;
i++;
}
else if (c == '0')
{
if ((c = getchar) == 'x' || c == 'X')
{
num[i] = '\0';
printf("%d", htoi(num));
i=0;
}
else
{
num[i] = c;
i++;
}
}
else
{
num[i] = '\0';
if (num[0] != '\0')
{
printf("%d", htoi(num));
}
i=0;
}
}
num[i] = '\0';
if (num[0] != '\0')
{
printf("%d", htoi(num));
}
i=0;
return 0;
}
int htoi(char num[])
{
int c,i, dig;
int dec;
int multiplier = 1;
for (i = strlen(num)-1; i >= 0; i--)
{
c = num[i];
if (c > '0' && c <= '9')
{
dig = c - '0';
}
else if (c > 'a' && c <= 'f')
{
dig = c - 'a' + 10;
}
else if (c > 'A' && c <= 'F')
{
dig = c - 'A' + 10;
}
dec = dec + dig * multiplier;
multiplier * 16;
return dec;
}
}
三个问题:
乘数*16;把结果扔掉。您需要乘数*=16
return dec立即返回当前的dec值。在循环之后应该有这个值
变量dec未初始化,这意味着它将有一个不确定的值。像您一样,在没有初始化的情况下使用它将导致未定义的行为
还有其他问题,其中一些问题可能被编译器捕获,从而导致错误或警告。以上三个是我快速浏览后发现的。您不能简单地搜索一下%x和&number?你观察到了什么?你期待什么?另外,如果c=getchar=='x',则使用调试器查找程序出错的位置c>='a'&&c='a'&&c='x'=>如果c=getchar=='x'..乘法器*16应该是乘法器*=16一些其他问题:1。如果c=getchar=='x'| | c=='x'=>应该是getchar 2。如果c>'a'&&c应将下限c>=a括起来