如何从char数组提取int类型值?我的Arduino代码输出全0求排查
问题:从格式为
nn_nn_n的字符串提取整数失败,输出全0 需求
从格式为nn_nn_n的输入文本(例如60_25_5)中提取三个不同的int类型值。
实现思路
将接收的文本通过下划线_分割为三部分并设置空字符'\0',分别存入三个char数组(text1、text2、text3),再使用atoi()函数转为int类型。
问题代码
#include <String.h> #include <stdlib.h> #include <SoftwareSerial.h> void setup() { Serial.begin(9600); Serial.println("start"); } void loop() { if(Serial.available()){ char *data = Serial.read();// = nn_nn_n data[2]='\0'; data[5]='\0'; char *str ; str = data ; char text1[4]; strcpy(text1,str); str = data + 3; char text2[4]; strcpy(text2, str); str = data + 6; char text3[4]; strcpy(text3, str); int a= atoi(text1); int b= atoi(text2); int c= atoi(text3); Serial.print(a); Serial.print(b); Serial.print(c); } }
运行结果
start 000000000000000000000000
错误分析与修正方案
核心错误点
Serial.read()使用错误Serial.read()返回单个字符的ASCII码(int类型),不是字符串指针。直接赋值给char *data会让指针指向非法内存,后续操作全是未定义行为。硬编码下标设置结束符
固定用下标2、5设置'\0',只适配固定长度的数字,一旦输入数字位数变化就失效,且逻辑不通用。不必要的内存复制
额外复制字符串到text1/text2/text3完全多余,浪费内存且增加出错概率。头文件错误
C标准库字符串头文件是<string.h>(小写s),不是<String.h>。
修正后的完整代码
#include <string.h> #include <stdlib.h> #include <SoftwareSerial.h> void setup() { Serial.begin(9600); Serial.println("start"); } void loop() { if(Serial.available()){ char data[10]; // 读取输入直到换行符,预留位置给字符串结束符 int len = Serial.readBytesUntil('\n', data, sizeof(data)-1); if(len > 0){ data[len] = '\0'; // 确保字符串以'\0'结尾 // 查找第一个下划线位置 char* underscore1 = strchr(data, '_'); if(underscore1 != NULL){ *underscore1 = '\0'; // 替换为结束符,分割出第一个数字 // 查找第二个下划线位置 char* underscore2 = strchr(underscore1 + 1, '_'); if(underscore2 != NULL){ *underscore2 = '\0'; // 分割出第二个数字 // 直接转换为整数 int a = atoi(data); int b = atoi(underscore1 + 1); int c = atoi(underscore2 + 1); // 格式化输出结果 Serial.print(a); Serial.print(" "); Serial.print(b); Serial.print(" "); Serial.println(c); } else { Serial.println("格式错误:缺少第二个下划线"); } } else { Serial.println("格式错误:缺少下划线"); } } } }
内容的提问来源于stack exchange,提问作者kimhc
相关产品推荐
相关产品推荐

