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中的流,但我似乎无法确定是什么。
这是一个较大项目的一小部分。总的来说,我将解析一个动态文本文件,然后对整个文件的内容进行比较。
答案 0 :(得分:5)
您无法直接写入TokenLine[i]
,因为它已在vector
构造函数中初始化为空CombatLine
。如果在读取每一行时构建向量,则不需要resize
。
试试这个:
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
构造函数中预先分配CombatLine
中的5个条目,但如果要处理的令牌数量发生变化,这会很脆弱。如果0&lt; = i&lt; = 4,则可以使用以下内容直接从stringstream
直接写入TokenLine[i]
。
CombatLine::CombatLine() : TokenLine(5)
{
}
答案 1 :(得分:1)
你需要首先调整TokenLine的大小,然后写入内容,或者更好的习惯是使用push_back,必要时会调整大小。