C十六进制到十进制的转换,我不明白我的代码出了什么问题

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

我的代码应该在用户输入中找到十六进制数,后跟或不后跟0x,将它们作为字符串复制到数组中,并且每次找到非1-9 a-f a-f字符或EOF时,都应该执行htoi函数,将字符串中的字符转换为十进制数,从右到左,使用乘数说明位置。它没有做它应该做的。它生成的数字与我的十六进制数的十进制等价物无关

#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括起来