0

header.h

#include <iostream>
#include <vector>

class CombatLine{   
    std::stringstream Line;    
    std::vector<std::string> TokenLine;  
    void SetLine(std::string s){   
        Line<<s;   
    }    
public:   
void SetTokenLine(){   
    int i=0;    
    while(i<5){   
        Line>>TokenLine[i];   
        i++;}      
    TokenLine.resize(i);   
    for(int j=0;j<5;j++)   
        cout<<TokenLine[j];} 

main.cpp

#include "Header.h"
using namespace std;   

int main () {   
    CombatLine Line1;   
    Line1.SetLine("[Combat] A bird attacks -Anthrax- and misses (dodge).");   
    Line1.SetTokenLine();   
}   

これはビルドされますが、このランタイム エラーが発生します。/cygdrive/C/Program Files/NetBeans 6.9.1/ide/bin/nativeexecution/dorun.sh: line 33: 4500 Segmentation fault <core dumped> sh "$<SHFILE>"

SetTokenFile で文字列とストリームを操作する方法に関係していることは知っていますが、何を特定することはできません。

これは、より大きなプロジェクトの小さな部分です。全体として、動的テキスト ファイルを解析し、後でファイル全体の内容を比較します。

4

2 に答える 2

5

コンストラクターでTokenLine[i]空として初期化されるため、直接書き込むことはできません。各行を読むときにベクトルを構築する場合 は必要ありません。vectorCombatLineresize

これを試して:

void SetTokenLine(){   
    int i=0;    
    string nextLine;
    while(i<5){   
        Line>>nextLine;
        TokenLine.push_back(nextLine);
        i++;}      
    for(int j=0;j<5;j++)   
        cout<<TokenLine[j];}

vectorまたは、既定のコンストラクターで5 つのエントリを事前に割り当てることもできますが、CombatLine処理するトークンの数が変化した場合、これは脆弱です。以下では、 if 0 <= i <= 4からstringstream直接書き込むことができます。TokenLine[i]

CombatLine::CombatLine() : TokenLine(5)
{
}
于 2010-11-26T20:38:31.153 に答える
1

最初に TokenLine のサイズを変更してからコンテンツに書き込む必要があります。または、必要に応じてサイズを変更する push_back を使用することをお勧めします。

于 2010-11-26T20:40:28.750 に答える