-cfyjbjonn 2019-05-02 16:16 采纳率: 57.1%
浏览 1984
已结题

关于用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之间的关系,求解答,谢谢。

  • 写回答

2条回答 默认 最新

  • threenewbee 2019-05-02 16:51
    关注

    这个就是查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;
    }

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

    评论

报告相同问题?

悬赏问题

  • ¥100 c语言,请帮蒟蒻看一个题
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)