0

以下のこの関数は、64ビット整数で埋められている文字列を取得し、各値は区切り文字で区切られ、ベクトルに入れられます。

vector<unsigned long long int> getAllNumbersInString(string line, char delim){
    vector<unsigned long long int> v;

    string word;
    stringstream stream(line);
    unsigned long long int num;

    while(getline(stream, word, delim))
        num = atol(word.c_str());
        v.push_back(num);
    }

    return v;
}

この関数は、たとえば、区切り文字として「、」がある場合は正常に機能しますが、文字列変数「line」のデータが次のようになっている場合、区切り文字は失敗します。

     432   12332    2234   12399   

データは区切り文字として空白を使用しているように見えますが、上記のコードでは、コード全体が論理的に失敗します。たとえば、空白の間の空白は未定義であり、atolは0を返し、これらのゼロをベクトルに入れます。

これらの異常をよりよく防ぐために、このコードにどのような対策を講じる必要がありますか?

4

2 に答える 2

3

このようなものを使用できない/使用しない理由はありますか?:

while (stream >> num)
   v.push_back(num);

あるいは単に:

vector<unsigned long long int> getAllNumbersInString(string line) { 
    istringstream stream(line);  
    typedef unsigned long long int T;

    vector<T> v((istream_iterator<T>(stream)), istream_iterator<T>());
    return v;
}

空白以外の区切り文字を処理する必要がある場合は、ctypeファセットを作成して、他に区切り文字として処理するものを指定できます。

于 2013-02-10T17:45:24.880 に答える
1

iostreamsライブラリに空白を処理させることができます。

unsigned long long int num;
while(stream >> num)
    v.push_back(num);
于 2013-02-10T17:44:32.960 に答える