You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 23:06:22