如何在 Arduino 中使用特定的分隔符拆分字符串?
How to split a string using a specific delimiter in Arduino?
我有一个字符串变量,我想提取由 ; 分隔的三个子字符串。到三个字符串变量。
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}"
这些模式中唯一的共同点是三个部分由 ; 分隔。
非常感谢任何见解。
谢谢
我认为您需要一个带有自定义分隔符的 split-string-into-string-array
函数。
网络上和 Whosebug 上已经有多个来源(例如 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);
编辑:更正单引号并在示例中添加分号。
新的 SafeString Arduino 库(可从库管理器获得)提供了许多 tokenizing/substring 方法,没有字符串的堆碎片 class
参见
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 使用。
我有一个字符串变量,我想提取由 ; 分隔的三个子字符串。到三个字符串变量。
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}"
这些模式中唯一的共同点是三个部分由 ; 分隔。
非常感谢任何见解。 谢谢
我认为您需要一个带有自定义分隔符的 split-string-into-string-array
函数。
网络上和 Whosebug 上已经有多个来源(例如 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);
编辑:更正单引号并在示例中添加分号。
新的 SafeString Arduino 库(可从库管理器获得)提供了许多 tokenizing/substring 方法,没有字符串的堆碎片 class
参见
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 使用。