0

このコードを実行すると、メモリの問題が発生します。

#include <iomanip>
#include <string>
#include <iostream>
#include <vector>

using namespace std;

int main(){
        vector<string> tokens;
        int x,y;
        string toParse = "word,more words,an int 5,some more,this is the 5th one,thisll be 6,seven,eight,nine,tenth,extra";
        for(y=0; y<10; y++){
            cout << "in for loop " << y << endl;
            x = toParse.find(",");
            tokens[y]= toParse.substr(0,x);
            toParse = toParse.substr(x+1);
        }
        for(y=0; y<9; y++)
            cout << tokens[y] << endl;
}

基本的に、コンマに応じて区切られた値を保存したいだけです。

x はカンマの位置に設定する必要があり、カンマまでの情報を保存します。次に、substr を使用してビットを取得する新しい文字列を取得し、カンマの後の行全体を取得します。セグメンテーション違反が発生します。

4

3 に答える 3

1

tokens[y]ベクトルに十分なアイテムを持たずに使用するためです。tokens.push_back(...)代わりに使用するか、10 個の項目でベクターを宣言する必要があります。

std::vector<std::string> tokens(10);
于 2013-09-16T17:01:49.340 に答える
1
vector<string> tokens;

これは、トークン ベクトルをデフォルト サイズ (0) で宣言します。次に、またはのoperator[]代わりにを使用してアイテムを追加しているため、割り当てられていないメモリにアクセスしています。配列のサイズを変更する必要があります。push_backemplace_back

tokens.resize(10);

またはpush_back/emplace_backを使用して挿入を行います。

tokens.push_back(toParse.substr(0, x));
于 2013-09-16T17:06:23.523 に答える
1

tokens[y]=toParse.substr(0, x)で代用

tokens.push_back(toParse.substr(0, x));

 for(y=0; y<10; y++){
        cout << "in for loop " << y << endl;
        x = toParse.find(",");
        tokens.push_back(toParse.substr(0,x));
        toParse = toParse.substr(x+1);
    }
    for(y=0; y<9; y++)
        cout << tokens[y] << endl;
于 2013-09-16T17:06:33.597 に答える