c++ - 从字符串中读取/解析多个 INT

标签 c++ c string robot

我一直在阅读有关将字符串转换为整数、“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

输出来 self 的真空机器人“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;
}

最佳答案

试试这个(未经测试,所以可能有小错误):

#include <iostream>
#include <sstream>
#include <string>
#include <cstdio>
using namespace std;

int main()
{
    string s("3,2,6,4\n2,3,4,5\n");
    istringstream iss(s);
    int a, b, c, d;
    string line;
    while (getline(iss,line))
    {
        // Method 1: Using C
        sscanf(line.c_str(),"%d,%d,%d,%d",&a,&b,&c,&d);


        // Method 2: Using C++
        std::stringstream  lineStream(line);
        char  comma;
        lineStream >> a >> comma >> b >> comma >> c >> comma >> d;


        // do whatever
    }

}

关于c++ - 从字符串中读取/解析多个 INT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12023934/

相关文章:

string - 通过恰好执行 K 个操作将字符串 S 转换为另一个字符串 T(添加到字符串 S 的末尾/从字符串 S 的末尾删除)

c++ - 将字符串转换为 char 指针可以指向的 char 数组/值的最有效方法是什么

c++ - 如何在 MFC 中创建预呈现输入窗口?

c# - C# 中从指定类型继承的模板类的等价物是什么?

c - 在 c 中释放 char 指针会导致段错误

javascript - 有没有更好的方法来使用 javascript 清理输入?

c++ - 针对不同的编译时结果,使用枚举专门化 operator()

c++ - 移动构造函数的意外调用

c - 随机数快速排序

c - 为什么 "Segmentation Fault "在 C 中仍然存在