web-dev-qa-db-ja.com

数値を含む文字列を整数配列に解析します

文字列は数値で構成される入力として与えられ、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";

16
djadmin

ファイルの終わりの条件はnot解析時に設定succesfulであり、解析後にストリームの状態を確認する必要があります。

二番目 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
21
Sebastian Mach

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

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);
}

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

3
Thacious

更新された質問の答えが見つかるかどうかわかりません。そうでない場合は、コードで簡単に行うことができます

for (string::iterator it = num.begin(); it != num.end(); ++it) {
    if (*it == ',') {
        *it = ' ';
    }
    else continue;
}

このコードはすべてのコロンを削除し、スペースで置き換えます。その後、あなたは普通に行うことができます

2
Duc Nguyen