游乐游手机版
首页/AI教程/文章详情

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

时间:2026-06-11 16:23
实现函数htoi将十六进制字符串(可含0x或0X前缀)转换为十进制整数。算法从字符串尾部逐位计算,跳过前两个前缀字符,按位权累加结果,输出对应的整数值。该函数支持大小写十六进制数字。

C语言经典练习:十六进制字符串转整数问题

先来看一个经典的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表示十六位,以此类推),每次循环更新位权ji并累加结果。需要特别注意的是,循环从下标len-1开始,直到下标2结束,目的是跳过开头的0x0X两个字符。这种实现思路清晰可靠,非常适合初学者理解十六进制转十进制的底层原理和位权计算方法。

来源:https://developer.aliyun.com/article/704673
上一篇年十大AI PPT工具实测对比:准确性、速度与设计感 下一篇Sulphur-2-GGUF整合包深度评测与AI视频工作流分享
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
RAG四标融合企业知识资产体系四库协同GEO优化实践
AI教程 · 2026-07-01

RAG四标融合企业知识资产体系四库协同GEO优化实践

生成式AI正在彻底改写信息检索的底层逻辑。传统SEO依赖关键词堆砌和外链建设的策略,在大模型的内容采信规则下已经基本失效。取而代之的,是生成式引擎优化(GEO)。它不再关注外链数量,而是重点衡量你的知识是否结构化、证据链是否坚实、信源是否可靠——这些维度才是RAG(检索增强生成)架构真正看重的核心指

一个普通上班人分享WorkBuddy使用心得与真实体验
AI教程 · 2026-07-01

一个普通上班人分享WorkBuddy使用心得与真实体验

前言 最近我开始使用WorkBuddy——这是腾讯推出的一款AI办公工作台。差不多用了一周时间,趁印象还新鲜,把真实的使用感受记录下来,给还在犹豫的朋友做个参考。不吹不黑,只说实际体验。 初印象:不只是聊天机器人 之前用过不少AI工具,大多数就是个对话框,你问它答,答完就结束了。WorkBuddy不

AI幻觉变真功能实战教程:App Inventor 2视频录制拓展一周开发实录
AI教程 · 2026-07-01

AI幻觉变真功能实战教程:App Inventor 2视频录制拓展一周开发实录

先讲一个颇具戏剧性的开端。 这件事的开端颇显荒诞——有用户前来咨询,称AI Pro版的介绍中提到我们有一款“视频录制拓展”。团队全体成员都感到困惑,翻遍产品列表,发现根本不存在该组件。AI那种“一本正经胡说八道”的能力,这次确实让我们陷入尴尬。 按常理,此事到此便可结束——一句“抱歉,暂时没有这个拓

别再混淆OLAP和SQL-on-Hadoop两者查询本质不同
AI教程 · 2026-07-01

别再混淆OLAP和SQL-on-Hadoop两者查询本质不同

OLAP和SQL-on-Hadoop虽都使用SQL查询数据,但本质不同。SQL-on-Hadoop负责海量数据批量计算与ETL,查询速度秒级至分钟级;OLAP通过预聚合实现毫秒级多维分析,适合BI报表。两者在数据平台分工协作,前者是后厨加工,后者是前台快速服务。

GEO优化深度解析:AI偏好FAQ还是长文内容?
AI教程 · 2026-07-01

GEO优化深度解析:AI偏好FAQ还是长文内容?

在GEO优化中,AI对内容形式无统一偏好:FAQ在简单查询中引用率41%,长文在复杂查询中达58%。内容应基于用户意图选择形式,FAQ适配简单事实类问题,长文建立主题权威,两者互补而非替代。