字符串中的拆分值均由逗号和字母分开
Split values in string separated by both comma and a letter
我当前正在与Arduino一起工作,例如,它看起来像这样:
"30,30,20,10,50,50M20"
我说,因为值总是可以改变。但是,这封信将永远是1个字母。总会有7个数字和1个字母。这封信将始终在值6到8之间。
在该字符串中有不同的值,它们都被逗号和字母隔开,这使得解决方案更加棘手。
如果我打破上面的字符串,我需要像这样存储:
a = 30
B = 30
C = 20
d = 10
E = 50
F = 50
g = m
h = 20
这些值会定期更改(以及每个值的长度(,因此必须以某种方式设置代码,以便将值通过','
和字母分开,在这种情况下为'M'
。
这是我尝试自己做的事情:
char c = Serial.read();
FindA = c.indexOf(',');
A = c.substring(0, ind1);
FindB = c.indexOf(',', ind1+1 );
B = c.substring(ind1+1, ind2+1);
然后以某种方式实施,因此它在字母之前和之后取出值(还需要存储(。
我也有 String recievedMessage += (char)Serial.read();
。
我正在arduino上发育。
假设字符串作为行发送(最后具有新的行字符 n
(。
typedef struct {
int A = 0;
int B = 0;
int C = 0;
int D = 0;
int E = 0;
int F = 0;
char G = 0;
int H = 0;
} Line;
typedef void (*LineHandler)(Line data);
bool line_parser(char c, LineHandler line_handler) {
static Line data;
static int value = 0;
static byte state = 0;
bool complete = false;
// ignore the carriage return character
if (c == 'r') return complete;
if (state < 8) {
if (isdigit(c)) {
value = value*10 + c-'0'; // add the digit
}
else if (c == ',' || c == 'n') {
// if a comma or end of line is found, save the value
switch (state) {
case 0: data.A = value; break;
case 1: data.B = value; break;
case 2: data.C = value; break;
case 3: data.D = value; break;
case 4: data.E = value; break;
// the F and G are set when the letter is found
case 7: data.H = value; break;
}
// advance the parsing state and reset the value
state++;
value = 0;
}
else if (state == 5 && isalpha(c)) { // if parsing the 6th number and a letter is found
data.F = value; // save the 6th number
data.G = c; // save the letter
state += 2; // advance to parsing the 8th value
value = 0; // reset the value
}
else
state = 10; // unexpected character; stop the parser
}
if (c == 'n') {
if (state == 8) {
//got complete line
line_handler(data);
complete = true;
}
else {
// parsing failed
}
// reset the parser
value = 0;
state = 0;
}
return complete;
}
void handle_line(Line data) {
// just print out the data
Serial.println("Line:");
Serial.print("A = ");
Serial.println(data.A);
Serial.print("B = ");
Serial.println(data.B);
Serial.print("C = ");
Serial.println(data.C);
Serial.print("D = ");
Serial.println(data.D);
Serial.print("E = ");
Serial.println(data.E);
Serial.print("F = ");
Serial.println(data.F);
Serial.print("G = ");
Serial.println(data.G);
Serial.print("H = ");
Serial.println(data.H);
Serial.println();
}
void setup() {
Serial.begin(115200);
}
void loop() {
if (Serial.available()) {
line_parser(Serial.read(), handle_line);
}
}
此解析器是非阻滞剂,并且是按字符为feed字符,并且在接收整行后,它调用了应处理解析数据的函数。
发送它:
54,125,11045,11,78,4H45
invalid line
11,22,33,44,55,66K88
30,30,20,10,50,50M20
应发回:
Line:
A = 54
B = 125
C = 11045
D = 11
E = 78
F = 4
G = H
H = 45
Line:
A = 11
B = 22
C = 33
D = 44
E = 55
F = 66
G = K
H = 88
Line:
A = 30
B = 30
C = 20
D = 10
E = 50
F = 50
G = M
H = 20
您可以为字符串编写一个小解析器,例如:
#include<cstdlib>
#include<cctype>
#include<iterator>
#include<vector>
std::vector<int> values(1);
char separator = ',';
// read every char from the stream and store it in i
for (int i = Serial.read(); i >= 0; i = Serial.read())
{
// check if i is a digit (and if so, append it to the previous digit)
if (std::isdigit(i))
{
values.back() = values.back() * 10 + std::atoi(i);
}
// check if i is a letter [A-Z][a-z]
else if (std::isalpha(i))
{
values.back() = i;
i = separator;
}
// check if i is the separator
if (i == separator)
{
values.push_back(0);
}
}
A = values[0];
B = values[1]
// ...
相关文章:
- 我还可以添加什么来按空格或空格正确拆分C++字符串?
- 通过空行提升拆分字符串
- 如何按多个括号类型拆分字符串,但仍将括号保留在C++?
- 如何根据字符拆分字符串
- 在C++中拆分字符串的最佳做法
- 如何使用两个不同的分隔符拆分字符串
- 基于 C++ 中的多个字符串分隔符拆分字符串
- 拆分字符串输入并查找字符是否有效
- 使用 boost::split 按分隔符的前 N 次匹配来拆分字符串
- 如何在C 中不带有弦乐和strtok的情况下拆分字符串(提取单词)
- 为什么在黑客兰克的许多问题中都会完成拆分字符串
- C++拆分字符串反馈
- C++:按制表符拆分字符串,但包含空格
- 基于其中的数字子字符串拆分字符串
- 按空格拆分字符串并将列输出到不同的数组中
- C++ STL 在逗号处拆分字符串
- 如何根据某些字符拆分字符串?经度纬度
- 如何在 c++ 中拆分字符串的一部分
- 如何通过分隔符拆分字符串并将每个字符串放入不同的向量中
- 我如何在QT中的更多子字中拆分字符串