提取整个字符串的序列(Arduino、C++、indexOf、子字符串)
Extracting a sequence of a whole string (Arduino, C++, indexOf, substring)
我想通过 Serial.println()[=26] 提取整个字符串的 任意部分 和 post =].
我遇到的来源问题是字符串值(A、B、C)是变量,因此"unknown"。它混淆了定义的终止符“-”和“END $”。我找不到合适的锚点来获取我想要的字符串的确切部分。我可以,如果这些字符串值不存在:"curD = 'Data: String1 A'" 与 "curD = 'String1'"。我只想 "String1 A"、"String2 B" 或 "String3 C".
示例 A、B、C 是整数、浮点数或 variable/random 长度的字符串。
这是我目前拥有的:
char headComputerData[] = "String1 - "; // test; can be String1 -, String2 - etc, to get the next adjacent string sequence till " -"
//char headComputerData[] = "Computer Data: "; // the prefix of the data value
char dashTerminator[] = " -"; // one possible suffix of a value
char dollarTerminator[] = " END $ "; // the other possible suffix of a value
int firstIndexComputerData; // index into inputStringPC of the first char of the value
String inputStringPC = "Computer Data: String1 A - String2 B - String3 C END $ ";
firstIndexComputerData = inputStringPC.indexOf(headComputerData);
firstIndexComputerData += strlen(headComputerData); // firstIndex is now the index of the char just past the head.
String compData = inputStringPC.substring// string everything between
(
firstIndexComputerData, //first index
inputStringPC.indexOf(dashTerminator, firstIndexComputerData) //last index (relative)
);
Serial.println(compData);
谢谢:)
无限制
输入:
"Computer Data: String1 A - String2 B - String3 C END $ "<br>
0 1 2 3 4 5 6 7 8 9 10
输出应该是
String1 A
String2 B
String3 C
如果那是正确的,为什么不使用 space 定界符 - 前提是输入始终是相同的格式(见上文),因此您可以按如下方式过滤:
uint8_t spaceIndex [11] = {}; // we store 10 values + 0 terminator
String inputStringPC = "Computer Data: String1 A - String2 B - String3 C END $ ";
for (uint8_t i = 0; i<10; i++){ // we read 10 space delimiter indices into an array
if (i != 0) spaceIndex[i] = inputStringPC.indexOf(' ', spaceIndex[i-1] );
else spaceIndex[i] = inputStringPC.indexOf(' ');
}
// Extract the relevant data as strings (indexStart + 1 / indexEnd - 1)
String Astring = inputStringPC.substring (spaceIndex[1] + 1, spaceIndex[3] -1);
String Bstring = inputStringPC.substring (spaceIndex[4] + 1, spaceIndex[6] -1);
String Cstring = inputStringPC.substring (spaceIndex[7] + 1, spaceIndex[9] -1);
如果我正确解释了你的问题,这应该会提供结果。
提示:去掉 Arsuino 中的字符串 class 并使用 char 数组。原理不变。
我想通过 Serial.println()[=26] 提取整个字符串的 任意部分 和 post =].
我遇到的来源问题是字符串值(A、B、C)是变量,因此"unknown"。它混淆了定义的终止符“-”和“END $”。我找不到合适的锚点来获取我想要的字符串的确切部分。我可以,如果这些字符串值不存在:"curD = 'Data: String1 A'" 与 "curD = 'String1'"。我只想 "String1 A"、"String2 B" 或 "String3 C".
示例 A、B、C 是整数、浮点数或 variable/random 长度的字符串。
这是我目前拥有的:
char headComputerData[] = "String1 - "; // test; can be String1 -, String2 - etc, to get the next adjacent string sequence till " -"
//char headComputerData[] = "Computer Data: "; // the prefix of the data value
char dashTerminator[] = " -"; // one possible suffix of a value
char dollarTerminator[] = " END $ "; // the other possible suffix of a value
int firstIndexComputerData; // index into inputStringPC of the first char of the value
String inputStringPC = "Computer Data: String1 A - String2 B - String3 C END $ ";
firstIndexComputerData = inputStringPC.indexOf(headComputerData);
firstIndexComputerData += strlen(headComputerData); // firstIndex is now the index of the char just past the head.
String compData = inputStringPC.substring// string everything between
(
firstIndexComputerData, //first index
inputStringPC.indexOf(dashTerminator, firstIndexComputerData) //last index (relative)
);
Serial.println(compData);
谢谢:)
无限制
输入:
"Computer Data: String1 A - String2 B - String3 C END $ "<br>
0 1 2 3 4 5 6 7 8 9 10
输出应该是
String1 A
String2 B
String3 C
如果那是正确的,为什么不使用 space 定界符 - 前提是输入始终是相同的格式(见上文),因此您可以按如下方式过滤:
uint8_t spaceIndex [11] = {}; // we store 10 values + 0 terminator
String inputStringPC = "Computer Data: String1 A - String2 B - String3 C END $ ";
for (uint8_t i = 0; i<10; i++){ // we read 10 space delimiter indices into an array
if (i != 0) spaceIndex[i] = inputStringPC.indexOf(' ', spaceIndex[i-1] );
else spaceIndex[i] = inputStringPC.indexOf(' ');
}
// Extract the relevant data as strings (indexStart + 1 / indexEnd - 1)
String Astring = inputStringPC.substring (spaceIndex[1] + 1, spaceIndex[3] -1);
String Bstring = inputStringPC.substring (spaceIndex[4] + 1, spaceIndex[6] -1);
String Cstring = inputStringPC.substring (spaceIndex[7] + 1, spaceIndex[9] -1);
如果我正确解释了你的问题,这应该会提供结果。
提示:去掉 Arsuino 中的字符串 class 并使用 char 数组。原理不变。