发布时间:2026/7/18 16:49:46
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/7/18 16:49:46

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

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

2026/7/18 16:49:46

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

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

2026/7/18 16:44:46

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

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

2026/7/18 19:34:54

Nebula 1.7.0:分享与效率双线更新,公开直链 + Cmd/Ctrl+K 命令面板

Nebula 1.7.0 聚焦分享与效率两条线。分享侧:对象可设为公开读并复制一个不会过期的永久公共直链,还能给每个账号配自定义域名 / CDN,直链走你自己的域名。效率侧:新增 Cmd/CtrlK 命令面板(输入即跳转账号 / 收藏,空输入先列最近访问)、收藏夹(收藏常去的桶 / 前缀一键跳回)与最…

2026/7/18 19:34:54

高频电路设计中的趋肤效应分析与优化实践

1. 趋肤效应:高频电流的"表面功夫" 当你在调试一块2.4GHz的WiFi模块时,突然发现传输线损耗比理论计算高出30%,或者当毫米波雷达的发射功率莫名衰减时,很可能遇到了射频工程师最熟悉的"隐形杀手"——趋肤效应。…

2026/7/18 19:34:54

慢病毒包装技术选型指南:从实验室需求到商业化应用的全面考量

在生命科学研究和基因治疗领域,慢病毒包装已成为基因递送的关键技术手段。无论是构建稳定细胞系、进行基因功能研究,还是推进临床转化应用,选择合适的慢病毒包装服务商直接影响实验效率和研究成果。本文从技术维度、服务能力和市场实践三个层…

2026/7/18 19:34:54

433MHz遥控器技术:调制原理与硬件实现详解

1. 433MHz遥控器的技术背景与应用场景433MHz频段在全球范围内都属于免许可的ISM频段(Industrial, Scientific and Medical),这个特性使其成为短距离无线通信的理想选择。与2.4GHz等高频段相比,433MHz具有更好的穿透能力和更远的传…

2026/7/18 19:34:54

嵌入式系统中USB接口设计与开发全解析

1. USB接口在嵌入式系统中的核心地位USB(Universal Serial Bus)作为现代嵌入式系统中最基础的外设接口之一,其重要性体现在三个维度:首先是物理连接的标准化,D/D-差分信号线设计使得各类设备能够通过统一接口实现通信&…

2026/7/18 19:29:54

Multisim虚拟示波器操作指南与高频信号测量技巧

1. 虚拟示波器基础认知虚拟示波器是通过软件模拟传统硬件示波器功能的工具,在Multisim这类电路仿真软件中属于核心测量仪器。与传统示波器相比,它的优势在于零硬件成本、参数灵活可调以及测量结果可视化程度高。我最初接触时发现其波形刷新率可达每秒60帧…

2026/7/17 5:59:06

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#…

2026/7/18 10:53:38

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境随着新能源汽车行业的快速发展,充电通信协议的标准化和测试验证变得尤为重要。GB/T 27930-2023作为中国智能充电协议的最新版本,对充电机与电动汽车之间的通信提出了更严格…

2026/7/17 7:39:19

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统无法识别RTL8852BE Wi-Fi 6网卡而烦恼吗?&#x1f…

2026/7/18 0:00:24

某智驾大牛创业

作者:钟声编辑:Mark出品:红色星际头图:智能驾驶图片据悉,国内某头部智驾公司端到端模型技术大牛Z投身创业,并且已经拿到融资。Z不仅是该头部公司内部最年轻的对标阿里P10级别技术负责⼈,更是业内…

2026/7/18 16:50:29

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…