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

C语言如何从字符串中提取数字?基于AVR mega32提取Delay数值驱动7段数码管

字符串提取数值+7段数码管显示实现方案

原代码问题整理

  • 字符比较错误:C语言中字符常量需要用单引号',原代码用双引号"把字符变成了字符串指针,比较逻辑完全失效
  • 未定义变量:代码中使用的x2、t1、t2没有提前声明,编译无法通过
  • 匹配逻辑不可靠:仅校验D和e两个字符容易误匹配其他字段,没有完整校验Delay前缀
  • 数值位置硬编码:固定取i+5位置的字符,一旦Delay后的数值位数变化就会提取错误
  • 缺少段码转换:直接将字符ASCII值输出到数码管IO口,无法对应正确的显示内容

修正后实现代码

#include <mega32.h>
#include <delay.h>
#include <ctype.h> // 用于isdigit判断数字字符

// 共阳7段数码管段码表 0~9,如使用共阴可自行替换对应段码
unsigned char seg_code[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned char i;
char str[50]="Speed=120K Delay=27 Hum=30% Time=12:20";
int delay_val = 0;

void main(void)
{
    DDRA  = 0xFF;  // 7段数码管输出端口
    PORTA = 0x00;

    while (1)
    {
        delay_val = 0;
        // 遍历字符串匹配Delay前缀
        for (i=0; i<45; i++) // 留足够长度避免越界
        {
            // 完整匹配 "Delay=" 前缀,如果是Delay:格式把最后一个判断改成str[i+5]==':'即可
            if(str[i] == 'D' && str[i+1] == 'e' && str[i+2] == 'l' && str[i+3] == 'a' && str[i+4] == 'y' && str[i+5] == '=')
            {
                i += 6; // 跳到Delay=后的第一个字符位置
                // 连续提取数字,直到遇到非数字字符
                while(isdigit(str[i]))
                {
                    delay_val = delay_val *10 + (str[i] - '0'); // 字符转数值
                    i++;
                }
                break; // 提取完成跳出循环
            }
        }
        // 输出到7段数码管,单数码管动态切换显示十位、个位,多位数码管可自行调整为位选扫描逻辑
        PORTA = seg_code[delay_val % 10]; // 显示个位
        delay_ms(1000);
        PORTA = seg_code[delay_val / 10 % 10]; // 显示十位
        delay_ms(1000);
    }
}

关键说明

  • 代码默认适配单数码管动态切换显示十位、个位,如有多位数码管可自行修改为静态输出逻辑
  • 段码表默认使用共阳7段数码管参数,如果你使用共阴数码管,将段码表替换为对应数值即可
  • 数值提取逻辑支持任意位数的Delay数值,无需硬编码位置,适配性更强

内容的提问来源于stack exchange,提问作者hadimargo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:06:11