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
相关产品推荐
相关产品推荐

