2

文字列を整数に変換すること、「atoi」および「strol」C標準ライブラリ関数、および頭を悩ませることができない他のいくつかのことについて読んでいます。

私が最初にやろうとしているのは、文字列から一連の数値を取得し、それらをint配列に入れることです。文字列のスニペットは次のとおりです(1つの文字列に複数の行があります)。

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

出力は私の掃除ロボット「NeatoXV-21」からのものです。上記の出力はCOMポート接続を介して取得し、現在文字列に格納しています。(ロボットはさまざまなものを出力できるため)。この例では、レーザースキャナーに更新を要求した後、ロボットからの出力を格納する文字列neatoOutputから読み取っています。

「getldsscan」は私がロボットに送信したコマンドです。COM出力を取得したときに読み戻されるだけなので、スキップします。次の行は、出力される各値に関する役立つ情報であり、スキップできます。それ以降、興味深いデータが出力されます。


データの各行の2番目の数値の値を取得しようとしています。その数は、スキャナーから障害物までの距離です。ロボットから報告されたすべての距離値を格納する、きちんとしたintdistanceArray [360]が必要です。ロボットは360の距離の値を出力します。

データの各行から他の値をチェックしたり読み取ったりすることにまだ悩まされていません。必要な現在の基本データを抽出する方法について頭を悩ませたら、後でそれらを取得するからです。これまでのところ、次のようなものを使用できます。

int startIndex = 2 + neatoOutput.find("X",0); //Step past end of line character

したがって、 startIndexは、データが開始する場所の文字インデックスを提供するはずですが、上記の例からわかるように、各数値のサイズは1文字から4文字までの範囲です。したがって、文字列を前に進めるだけでは、設定された量は機能しません。

私がやろうと思っているのは…

neatoOutput.find("\n",startIndex );

もう少しコードがあれば、一度に1行ずつ解析できるはずです。しかし、私が望む行の2番目の数値をどのように抽出するかについてはまだ混乱しています。


ロボットのハッキング/コーディングに興味がある人は、次のURLにアクセスしてください。-



更新:解決済み

皆さんの助けに感謝します。これが私が近い将来に使用するコードです。使用する必要があると思ったintstartIndex変数を知る必要がなくなったことに気付くでしょう。

//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;
}
4

2 に答える 2

3

これを試してみてください(テストされていないので、マイナーなバグかもしれません):

#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
    }

}
于 2012-08-19T03:21:58.083 に答える
1

文字列を自分で解析できます。それは簡単です。

コード:

int ParseResult(const char *in, int *out)
{
    int next;
    const char *p;

    p = in;
    next = 0;

    while (1)
    {
        /* seek for next number */
        for (; !*p && !isdigit(*p); ++p);

        if (!*p)
            break;  /* we're done */

        out[next++] = atoi(p);  /* store the number */

        /* looking for next non-digit char */
        for (; !*p && isdigit(*p); ++p);
    }

    return next;  /* return num numbers we found */
}
于 2012-08-19T03:28:14.380 に答える