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;}

相关新闻

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

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

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

2026/9/25 5:20:23 阅读更多 →
可调混合喷嘴喷头龙头厂家

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

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

2026/10/2 1:12:16 阅读更多 →
do you like the animation in the film.

do you like the animation in the film.

that’s the most interesting season i’ve seen so far. she was shocked by the surprising news. frozen. male split does this music interest you. should i wear this red dress to the event. obvious when did you start to like basketball. i have beem watching g…

2026/10/2 19:15:09 阅读更多 →

最新新闻

Cursor插件系统实战:plugin.json配置与CLI排查指南

Cursor插件系统实战:plugin.json配置与CLI排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 Cursor、Codex CLI、Zcode CLI 这类工具,大概率会在某个时刻撞上“plugins”这个词。它可能出现在配置文件里,可能出现在启动报错里,也可能出现在你试图让编辑器…

2026/10/4 16:15:36 阅读更多 →
【ArkUI进阶练中学】第3课:自定义节点与底层渲染

【ArkUI进阶练中学】第3课:自定义节点与底层渲染

本节目标 理解 ArkUI 三类自定义节点(FrameNode、RenderNode、BuilderNode)的定位与协作关系掌握 FrameNode 的创建、节点树操作(增删查改)与挂载显示方法掌握 NodeController 与 NodeContainer 的配合机制,理解自定义…

2026/10/4 16:15:36 阅读更多 →
告别本地环境!20+款浏览器开发ESP32工具实测与全流程指南

告别本地环境!20+款浏览器开发ESP32工具实测与全流程指南

1. 为什么我彻底放弃了本地环境,转向浏览器开发 ESP搞 ESP32 的朋友大概都有过这种经历:新电脑到手,兴致勃勃想跑个点灯程序,结果光是装 Arduino IDE、配 ESP32 开发板管理器、下载那几个 G 的离线包,就耗掉一整个下午…

2026/10/4 16:15:36 阅读更多 →
深入解析插件机制:从plugin.json到TypeScript SDK的加载与激活

深入解析插件机制:从plugin.json到TypeScript SDK的加载与激活

1. 从“plugins”这个标题说起:它到底指什么“plugins”这个词看起来简单,但它背后牵扯的东西其实相当多。如果你是在技术社区里看到这个标题,大概率它指向的是某个编辑器、IDE、CLI 工具或者某个平台的插件体系。结合热搜词里反复出现的 cur…

2026/10/4 16:15:36 阅读更多 →
深入解析插件系统:plugin.json、TypeScript SDK与CLI协作机制

深入解析插件系统:plugin.json、TypeScript SDK与CLI协作机制

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 Cursor、Codex CLI、Zcode CLI 这类工具,大概率会在某个时刻撞上plugins这个词。它可能出现在配置文件里,可能出现在启动日志里,也可能出现在某个报错信息里&am…

2026/10/4 16:15:36 阅读更多 →
【ArkUI进阶练中学】第1课:状态管理V2与深度观测

【ArkUI进阶练中学】第1课:状态管理V2与深度观测

本节目标 理解状态管理 V1 在嵌套对象观测上的根本局限,掌握 V2 深度观测的设计理念掌握 ObservedV2 与 Trace 的配合机制,能够实现对嵌套类和继承类的属性级深度观测掌握 V2 组件装饰器 ComponentV2、Local、Param、Once、Event 的用法与约束掌握 Monit…

2026/10/4 16:14:36 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →