关于用getchar输入数字的疑问11111111111111111111111111111

问题:写一函数,输入一个十六进制数,输出相应的十进制数。
程序的运行示例如下:
输入十六进制数:
3a
十进制数58
继续吗?
y
输入十六进制数:
2f
十进制数47
继续吗?
N

#include <stdio.h> 

#define     MAX     1000 

int main() 
{ 
    int c, i, flag, flag1; 
    char t[MAX]; 

    i = 0; 
    flag = 0; 
    flag1 = 1; 
    printf("\n输入十六进制数:"); 
    while ((c = getchar()) != '\0' && i < MAX && flag1) 
        //int c不是int吗为什么能直接用getchar,getchar不是只能输入字符码?以及16进制中也包含字母,用int c不会出错吗?
    { 
        if (c >= '0' && c <= '9' || c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F') 
        { 
            flag = 1; 
            t[i++] = c; //这里的int为什么直接转化为char了?
        } 
        else if (flag) 
        { 
            t[i] = '\0'; 
            printf("\n十进制数%d\n", htoi(t)); 
            printf("继续吗?"); 
            c = getchar(); 
            if (c == 'N' || c == 'n') 
            { 
                flag1 = 0; 
            } 
            else
            { 
                flag = 0; 
                i = 0; 
                printf("\n输入十六进制数:"); 
            } 
        } 
    } 

    return 0; 
} 

htoi(char s[]) 
{ 
    int i, n; 

    n = 0; 
    for (i = 0; s[i] != '\0'; i++) 
    { 
        if (s[i] >= '0' && s[i] <= '9') 
        { 
            n = n * 16 + s[i] - '0'; 
        } 
        if (s[i] >= 'a' && s[i] <= 'f') 
        { 
            n = n * 16 + s[i] - 'a' + 10; 
        } 
        if (s[i] >= 'A' && s[i] <= 'F') 
        { 
            n = n * 16 + s[i] - 'A' + 10; 
        } 
    } 

    return n; 
}

我把疑惑写在相应代码行了,以及我不太能理清这个代码里面十六进制的输入和int char之间的关系,求解答,谢谢。

这个就是查ascii表
图片说明

你可以看到,a是97 b是98 c是99... A是65,B是66,C是67... 0是48 1是49 2是50 ...
因此有
n = '3' - '0' 就是 n = 51 - 48 = 3 就把字符'3'转换成数字3了。
类似的
n = 'B' - 'A' + 10可以把十六进制的B转换为11。

if (s[i] >= '0' && s[i] <= '9')
{
n = n * 16 + s[i] - '0';
}
if (s[i] >= 'a' && s[i] <= 'f')
{
n = n * 16 + s[i] - 'a' + 10;
}
if (s[i] >= 'A' && s[i] <= 'F')
{
n = n * 16 + s[i] - 'A' + 10;
}

所以这些代码可以从字符串转换为对应的数字

1、char的范围是0-255, 使用一个int来存储是没有问题的;
2、16进制数的范围是0-15(0-f); 对应字符为'0'-'9', 'a'-'f'(或'A'-'F')
3、用户能输入的都是字符,即:'0'-'9', 'a'-'f'(或'A'-’F'), 需要转换成对应的数值 0-15;
4、getchar确实只能输入字符,这里需要的就是 '0'-'9', 'a'-'f'(或'A'-’F')这几个字符,getchar得到的值(int)就是这几个字符的ascii码值48-57, 113-118(或81-86)
5、htoi,完成了将48-57, 113-118(或81-86) 转换成 0-15的职责