20

文字列は数値で構成される入力として与えられ、C++ で整数配列に変換したいと考えています。

#include <string>
#include <iostream>
#include <sstream>

using std::string;
using std::stringstream;
using std::cout;
using std::endl;

int main(int argc,char** argv) {

    string num="-24 2 90 24 50 76";

    stringstream stream(num);

    while(stream){
        int n;
        stream>>n;
        cout<<n<<endl;
    }

    return 0;
}

出力 (GCC) :

-24 2 90 24 50 76 76

余分な値が得られるのはなぜですか?それらを整数配列に変換するのに効率的なのは何ですか?

アップデート:

文字列ストリームにスペース以外の区切り文字が含まれている場合、これを解析するにはどうすればよいですか? 例: string num="-24,2,90,24,50,76";

4

3 に答える 3

21

ファイルの終了条件は、解析が成功しても設定されないため、解析後にストリームの状態を確認する必要があります。

2 つ目76は、基本的に単なる偶然です。解析に失敗すると、ターゲット オペランドはそのまま残りますn

クイックフィックス:

stream>>n;
if (stream)
    cout<<n<<endl;

よりクリーンな修正:

int n;
while(stream >> n){
    cout<<n<<endl;
}

これらの整数を格納するための標準的な方法はstd::vector、要素数が不明な場合に使用することです。使用例:

std::vector<int> values;
int n;
while(stream >> n){
    ...do something with n...
    values.push_back(n);
}

ただし、ストリームに対してイテレータを使用し、次を使用できます。

// Use std::vector's range constructor
std::vector<int> values(
     (std::istream_iterator<int>(stream)), // begin
     (std::istream_iterator<int>()));      // end
于 2013-07-18T13:37:41.453 に答える
3

ベクトルを使用して文字で区切られた整数リストを処理する別の方法は、おそらくもう少し単純化されていますが、次のようなものです。

string str = "50,2,25,38,9,16";
vector<int> ints;
stringstream ss(str);
int n;
char ch;

while(ss >> n) {
    if(ss >> ch)
        ints.push_back(n);
    else
        ints.push_back(n);
}

そうすれば、最初に文字区切り(存在する場合)を超えて移動し、デフォルトで整数を取得して、そうでない場合はリストに追加することができます(AKAリストの最後)

于 2015-08-26T12:39:29.693 に答える