C语言如何用for循环精简代码 实现字符串双位解析存入hrs数组
C语言闹钟小时解析逻辑循环优化方案
核心规律
观察重复代码的索引对应关系:
hrs数组下标从0到5共6个元素,对应6组闹钟小时- 第
i组小时的十位字符在字符串中的位置为2*i,个位字符位置为2*i + 1 - 所有组的转换逻辑完全一致:十位数字*10 + 个位数字,完全可以用for循环统一处理
优化后完整代码
同时修复原代码存在的多个严重bug:返回局部栈数组导致野指针、scanf未指定格式和长度限制导致缓冲区溢出、返回值类型不匹配
#include <stdio.h> unsigned int* alarm_hrs(void) { static unsigned int hrs[6]; char str[15]; // 限制最大读取长度为14,预留字符串结束符位置,避免溢出 scanf("%14s", str); for (int i = 0; i < 6; i++) { int pos = 2 * i; hrs[i] = (str[pos] - '0') * 10 + (str[pos + 1] - '0'); } return hrs; }
改动说明
- 用单层for循环替代6段重复的转换代码,后续如果需要调整闹钟组数、字符偏移规则,仅需修改循环边界和偏移计算逻辑即可,维护成本大幅降低
- 将魔数
48替换为字符常量'0',无需记忆ASCII码值,代码可读性更高 - 给
hrs数组添加static修饰,将其存储在静态内存区,修复原代码返回局部变量地址导致的野指针问题 - 补全
scanf的字符串格式符%s,增加读取长度限制,避免超长输入引发缓冲区溢出 - 修正原函数返回值类型,原代码定义返回
int但实际返回数组首地址,类型不匹配会引发未定义行为
内容的提问来源于stack exchange,提问作者vedant_naik
相关产品推荐
相关产品推荐

