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

如何从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

错误分析与修正方案

核心错误点

  1. Serial.read()使用错误
    Serial.read()返回单个字符的ASCII码(int类型),不是字符串指针。直接赋值给char *data会让指针指向非法内存,后续操作全是未定义行为。

  2. 硬编码下标设置结束符
    固定用下标2、5设置'\0',只适配固定长度的数字,一旦输入数字位数变化就失效,且逻辑不通用。

  3. 不必要的内存复制
    额外复制字符串到text1/text2/text3完全多余,浪费内存且增加出错概率。

  4. 头文件错误
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:33:23