C语言学习笔记20260718-实现任意进制字符串转十进制(my_atoi_base)

发布时间:2026/9/13 22:46:51

C语言学习笔记20260718-实现任意进制字符串转十进制(my_atoi_base) C语言学习笔记20260718-实现任意进制字符串转十进制my_atoi_base1. 核心功能与算法原理在嵌入式开发或底层数据处理中我们经常需要将不同进制的字符串如十六进制的寄存器地址、二进制的状态码转换为十进制整数。标准库的atoi()只能处理十进制因此需要手动实现一个支持任意进制2-36进制的转换函数。本代码的核心算法是**“秦九韶算法”又称霍纳法则**的变种。其核心思想是从左到右逐位扫描每读取一位就将当前结果乘以进制基数再加上当前位的数值。例如将十六进制字符串1A转换为十进制初始result 0读取1(值为1)result 0 * 16 1 1读取A(值为10)result 1 * 16 10 26最终结果为 26。2. 代码逻辑逐段解析2.1 前置校验与变量初始化函数首先对输入指针str和进制base进行合法性校验只支持2-36进制。同时定义了result用于累加结果sign用于记录正负号i作为字符串索引。2.2 预处理跳过空格、处理符号与十六进制前缀跳过空格使用isspace()循环跳过字符串开头的空白字符。处理符号检测首字符是否为-或记录符号位并移动索引。处理十六进制前缀如果进制是16且字符串以0x或0X开头自动跳过这两个字符从真正的数值位开始解析。2.3 核心转换循环使用while(str[i])逐位遍历字符串字符转数值0-9直接减去0得到 0-9。A-Z或a-z减去A或a后加 10得到 10-35。合法性判断如果转换出的digit大于等于当前进制base例如二进制中出现了2则视为非法字符直接跳出循环。溢出检测在累加前通过数学公式预判result * base digit是否会导致int溢出。如果正数溢出返回INT_MAX负数溢出返回INT_MIN。累加计算执行result result * base digit。3. 关键知识点总结字符与数字的转换在 ASCII 码中数字字符0-9是连续排列的字母A-Z也是连续的。利用这一特性可以通过简单的减法完成字符到数值的映射。防溢出设计直接进行result * base digit计算在数值极大时会导致int溢出产生不可预知的错误。在计算前使用(INT_MAX - digit) / base进行预判是编写健壮底层库函数的必备技巧。进制范围由于使用了 0-9 和 A-Z/a-z 作为数值符号该算法最大支持 36 进制。4. 完整代码Doxygen 注释版/** * file my_atoi_base.c * brief 自定义任意进制字符串转十进制整数工具函数 * * 实现了支持 2-36 进制的字符串转整数功能包含溢出检测与非法字符过滤。 * 适用于嵌入式开发、底层数据处理等场景。 * * author YourName * date 2026-07-18 * version v1.0 */#define_CRT_SECURE_NO_WARNINGS1#includestdio.h#includestring.h#includectype.h#includelimits.h/** * brief 将指定进制的字符串转换为十进制整数 * * 核心算法采用秦九韶算法霍纳法则从左到右逐位扫描并累加。 * 支持跳过前导空格、处理正负号以及十六进制前缀0x/0X。 * 内置整数溢出检测机制保证数值转换的安全性。 * * param[in] str 待转换的字符串指针支持包含数字、大小写字母 * param[in] base 目标进制基数取值范围2 ~ 36 * * return 转换后的十进制整数 * retval 0 输入指针为空或进制非法 * retval INT_MAX 正数转换发生溢出时返回 * retval INT_MIN 负数转换发生溢出时返回 * * note 如果字符串中包含超出当前进制范围的字符转换将提前终止并返回已累加的结果。 * warning 该函数仅支持 2 到 36 进制超出此范围将直接返回 0。 */intmy_atoi_base(constchar*str,intbase){// 前置校验空指针与非法进制范围if(strNULL)return0;if(base2||base36)return0;intresult0;intsign1;inti0;intdigit;// 1. 预处理跳过前导空格while(isspace(str[i]))i;// 2. 预处理处理正负符号if(str[i]-){sign-1;i;}elseif(str[i]){i;}// 3. 预处理处理十六进制前缀 (0x 或 0X)if(base16str[i]0(str[i1]x||str[i1]X)){i2;}// 4. 核心转换循环while(str[i]){// 将字符映射为对应的数值if(str[i]0str[i]9){digitstr[i]-0;}elseif(str[i]Astr[i]Z){digitstr[i]-A10;}elseif(str[i]astr[i]z){digitstr[i]-a10;}else{break;// 遇到非数字/字母字符提前终止}// 校验当前数值是否超出进制范围如二进制中出现 2if(digitbase)break;// 溢出检测防止 result * base digit 超出 int 范围if(sign1result(INT_MAX-digit)/base){returnINT_MAX;}if(sign-1-result(INT_MINdigit)/base){returnINT_MIN;}// 秦九韶算法累加resultresult*basedigit;i;}returnresult*sign;}/** * brief 主函数用于测试 my_atoi_base 转换逻辑 * return 0 表示程序正常退出 */intmain(){// 测试用例 1十六进制转换带 0x 前缀printf(十六进制 0x1A 转十进制: %d\n,my_atoi_base(0x1A,16));// 测试用例 2二进制转换printf(二进制 1011 转十进制: %d\n,my_atoi_base(1011,2));// 测试用例 3带负号的十进制转换printf(十进制 -100 转十进制: %d\n,my_atoi_base(-100,10));// 测试用例 4三十六进制转换最大支持进制printf(三十六进制 Z 转十进制: %d\n,my_atoi_base(Z,36));// 测试用例 5溢出测试与非法输入测试printf(非法进制(1)测试: %d\n,my_atoi_base(101,1));printf(空指针测试: %d\n,my_atoi_base(NULL,10));return0;}
延伸阅读

更多相关文章

2026/9/10 5:08:12

基于Django的电信资费管理系统开题报告

一、课题研究背景 随着通信行业数字化转型持续深化,电信用户规模持续扩张、通信业务类型不断丰富,涵盖手机流量、语音通话、短信服务、宽带套餐、增值业务等多元化服务品类,不同用户群体、不同使用场景对应差异化资费标准,使得电信…

2026/9/10 20:59:02

可调混合喷嘴喷头龙头厂家

广州育詹仁喷嘴厂家:为可调混合喷嘴喷头龙头市场注入新活力在当今工业生产和日常生活中,可调混合喷嘴喷头龙头的应用日益广泛。而广州育詹仁喷嘴厂家作为行业内的重要参与者,正凭借自身的实力与特色在市场上崭露头角。先进的技术支撑广州育詹…

2026/9/11 22:51:33

PS如何抠图?PS抠图最快又完整的方法

你是不是也经常被抠图折磨得想砸电脑?特别是处理发丝、透明物体、复杂边缘时,传统PS抠图方法耗时又费力,让人崩溃。今天,我将分享PS5种最实用的PS抠图方法,从PS基础工具到AI插件一键抠图,让你告别”抠图难”…

2026/9/13 22:43:19

Appium+Python自动化测试实战源代码资料

自动化测试源码在 IT 行业内, 自动化测试属于提升软件开发效率与质量的要紧办法, 对移动应用开发范畴而言更是如此, 而这里提及的是“自动化测试源码”。自动化测试关于自动化测试的详细解析, 在正式运用结合并开展自动化测试之前, 首先得完成一系列基础环境的搭建, 这是第一步…

2026/9/13 22:43:19

ansible 实例 -- 用于 Linux 文件系统的操作 -- 修改文件或目录权限

如何使用 Ansible 修改文件或目录权限? 我将向你展示如何更改 test.txt 文件的 chmod 和所属组。 如何自动化修改文件/目录权限。 今天我们来谈谈 Ansible 模块 file。 全名是 ansible.builtin.file,这意味着它是 Ansible 自带的 “builtin” 集合的一部分。 这是一个非…

2026/9/13 22:43:19

Firecrawl 实战:将网站转换为大模型可用数据

本文摘要:传统爬虫直接获取的 HTML 包含导航、脚本、广告等噪音,无法作为大语言模型(LLM)的优质上下文。Firecrawl 是一款开源的网页数据转换引擎,它提供了一条清晰的管线:输入 URL → 智能爬取/渲染 → 输…

2026/9/13 0:01:16

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/13 0:01:16

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/12 14:32:17

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/13 11:18:28

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码