如何在Arduino中使用特定分隔符拆分字符串?

时间:2015-04-16 10:04:28

标签: arduino

我有一个String变量,我想提取separeted的三个子串;三个字符串变量。

String application_command = "{10,12; 4,5; 2}";

我不能使用substring方法,因为这个字符串也可以像以下任何一个或类似的模式一样。

String application_command = "{10,12,13,9,1; 4,5; 2}"

String application_command = "{7; 1,2,14; 1}"

这些模式中唯一常见的是有三个部分用;。

分隔

非常感谢任何见解。 谢谢

2 个答案:

答案 0 :(得分:14)

我认为你需要一个带有自定义分隔符的split-string-into-string-array函数。

网上和stackoverflow上已有多个来源(例如Split String into String array)。

// https://stackoverflow.com/questions/9072320/split-string-into-string-array
String getValue(String data, char separator, int index)
{
  int found = 0;
  int strIndex[] = {0, -1};
  int maxIndex = data.length()-1;

  for(int i=0; i<=maxIndex && found<=index; i++){
    if(data.charAt(i)==separator || i==maxIndex){
        found++;
        strIndex[0] = strIndex[1]+1;
        strIndex[1] = (i == maxIndex) ? i+1 : i;
    }
  }

  return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
}

您可以按如下方式使用此功能(使用“;”作为分隔符):

String part01 = getValue(application_command,';',0);
String part02 = getValue(application_command,';',1);
String part03 = getValue(application_command,';',2);

编辑:更正单引号并在示例中添加分号。

答案 1 :(得分:0)

新的SafeString Arduino库(可从库管理器中获得)提供许多标记化/子字符串方法,而不会导致String类的堆碎片化

请参见
https://www.forward.com.au/pfod/ArduinoProgramming/SafeString/index.html
以获得详细的教程

在这种情况下,您可以使用

#include "SafeString.h"

void setup() {
  Serial.begin(9600);

  createSafeString(appCmd, 50);  // large enought for the largest cmd
  createSafeString(token1, 20);
  createSafeString(token2, 20);
  createSafeString(token3, 20);
  appCmd = "{10,12,13,9,1; 4,5; 2}";
  size_t nextIdx = 1; //step over leading {
  nextIdx = appCmd.stoken(token1, nextIdx, ";}");
  nextIdx++; //step over delimiter
  nextIdx = appCmd.stoken(token2, nextIdx, ";}");
  nextIdx++; //step over delimiter
  nextIdx = appCmd.stoken(token3, nextIdx, ";}");
  nextIdx++; //step over delimiter
  // can trim tokens if needed e.g. token1.trim()
  Serial.println(token1);
  Serial.println(token2); 
  Serial.println(token3);
}

void loop() {
}

还要看一下pfodParser,它解析这些类型的消息{}供pfodApp使用。