我一直在阅读有关将字符串转换为整数、“atoi”和“strol”C 标准库函数以及其他一些我似乎无法理解的内容。
我最初尝试做的是从字符串中获取一系列数字并将它们放入一个 int 数组中。这是字符串的片段(单个字符串中有多行):
getldsscan
AngleInDegrees,DistInMM,Intensity,ErrorCodeHEX
0,0,0,8035
1,0,0,8035
2,1228,9,0
3,4560,5,0
...
230,1587,80,0
231,0,0,8035
232,1653,89,0
233,1690,105,0
234,0,0,8035
...
358,0,0,8035
359,0,0,8035
ROTATION_SPEED,4.99
输出来自我的真空机器人“Neato XV-21”。我已经通过 COM 端口连接获得了上面的输出,并且我目前已经将它存储在一个字符串中。(因为机器人可以输出各种不同的东西)。在这个例子中,我正在读取一个字符串neatoOutput,它包含了在我从其激光扫描仪请求更新后机器人的输出。
“getldsscan”是我发送给机器人的命令,当我得到 COM 输出时它只是被读回,所以我们跳过它。下一行只是关于输出的每个值的有用信息,可以跳过。从那时起,有趣的数据被输出。
我正在尝试获取每行数据中第二个数字的值。该数字是从扫描仪到障碍物的距离。我想要一个整洁的int distanceArray[360],其中包含从机器人报告回来的所有距离值。机器人将输出 360 个距离值。
我还没有对错误检查或从每一行数据中读取其他值大惊小怪,因为一旦我知道如何提取我想要的当前基本数据,我会在稍后得到它们。到目前为止,我可以使用类似的东西:
int startIndex = 2 + neatoOutput.find("X",0); //Step past end of line character
所以startIndex应该给我数据开始位置的字符索引,但正如您在上面的示例中看到的那样,每个数字的值的大小范围从单个字符到 4 个字符。所以简单地在字符串中前进一个设定的数量是行不通的。
我正在考虑做的事情是......
neatoOutput.find("\n",startIndex );
使用更多代码,我应该能够一次解析一行。但是我仍然对如何提取我想要的行中的第二个数字感到困惑。
如果有人对黑客/编码机器人感兴趣,你可以去:-
更新:已解决
感谢大家的帮助,这是我近期要使用的代码。您会注意到我最终不需要知道我认为需要使用的int startIndex变量。
//This is to check that we got data back
signed int dataValidCheck = neatoOutput.find("AngleInDegrees",0);
if (dataValidCheck == -1)
return;
istringstream iss(neatoOutput);
int angle, distance, intensity, errorCode;
string line;
//Read each line one by one, check to see if its a line that contains distance data
while (getline(iss,line))
{
if (line == "getldsscan\r")
continue;
if (line == "AngleInDegrees,DistInMM,Intensity,ErrorCodeHEX\r")
continue;
sscanf(line.c_str(),"%d,%d,%d,%d",&angle,&distance,&intensity,&errorCode); //TODO: Add error checking!
distanceArray[angle] = distance;
}