C语言习题2-3答案及详细解析

2026-06-11阅读 0热度 0
其他

十六进制字符串转十进制整数问题详解

先看一道经典的C语言实操题:编写一个函数htoi(s),将表示十六进制数字的字符串(支持可选前缀0x0X)转换为对应的十进制整数值。合法字符包括0-9A-Fa-f。表面简单,实际涉及前缀校验、字符合法性判断以及按位权累加,值得一步步拆解。

C程序设计语言习题2-3答案

功能模块拆分

整个程序可划分为三个独立模块:

  • 主函数main:负责读取用户输入,循环调用转换逻辑;
  • 输入函数get_line(注意命名,标准库stdio.h已提供getline,需避免冲突)负责读取一行字符串;
  • 核心函数htoi:承担十六进制到十进制整数转换的全部运算。

完整代码实现

以下给出带注释的完整实现。算法核心思路很直观:以输入0x32为例,结果为3 × 16¹ + 2 × 16⁰,从字符串末尾向开头逐位累乘权值即可。

#include
#define LINE 1000        // 每行接收的最大字符数
#define DEC 10           // 数字10
#define HEX 16           // 数字16

int get_line(char s[]);
int htoi(char s[]);

int main() {
    char line[LINE];
    int len;
    int dec;
    while ((len = get_line(line)) > 0) {
        printf("Hex is: %s\n", line);
        dec = htoi(line);
        printf("Dec is: %d\n", dec);
    }
    return 0;
}

// 接收每次输入的字符,并返回长度
int get_line(char s[]) {
    int i;
    char c;
    for (i = 0; i < LINE - 1 && (c = getchar()) != EOF && c != '\n'; i++) {
        s[i] = c;
    }
    s[i] = '\0';
    return i;
}

/*
 * 十六进制字符串转为十进制整数
 * 算法描述:例如输入字符串 "0x32",那么 result = 3 * 16^1 + 2 * 16^0
 */
int htoi(char s[]) {
    int dec, len, i, n, j, ji, k;
    len = 0;
    dec = 0;
    while (s[len] != '\0') {
        len++;    // 获取字符串长度
    }

    j = 0;
    for (i = len - 1; i >= 2; i--) {   // 从最后一位往前,跳过前两个字符("0x")
        // 处理不同字符
        if (s[i] >= '0' && s[i] <= '9') {
            n = s[i] - '0';
        } else if (s[i] >= 'a' && s[i] <= 'f') {
            n = s[i] - 'a' + DEC;
        } else if (s[i] >= 'A' && s[i] <= 'F') {
            n = s[i] - 'A' + DEC;
        }

        ji = 1;
        if (j == 0) {
            ji = 1;
        } else {
            k = j;
            while (k > 0) {
                ji = ji * HEX;
                k--;
            }
        }
        j++;
        dec = dec + ji * n;
    }
    return dec;
}

上述htoi函数从字符串尾部向前逐位计算:变量j表示当前位序号(0代表个位,1代表16¹位,依次类推),每次循环先计算当前位权ji,然后累加结果。注意循环从len-1开始,终止于下标2,以跳过开头的0x0X两个字符。该实现逻辑清晰,非常适合初学者掌握十六进制转换的本质原理。

免责声明

本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。

相关阅读

更多
欢迎回来 登录或注册后,可保存提示词和历史记录
登录后可同步收藏、历史记录和常用模板
注册即表示同意服务条款与隐私政策