2015-05-06 2 views
-3

enter image description here Когда я использую функцию StrSplit с постоянной строкой, она отлично работает. но когда я читаю строку из файла, а затем использую ее как строку для функции StrSplit, моя программа вылетает из строя. ниже приведен код и снимок экрана ошибки.После компиляции кода он сбой (не удалось получить почему)

string Read_from_file(){ 

//load the text file and put it into a single string: 
std::ifstream in("test.txt"); 
std::stringstream buffer; 
buffer << in.rdbuf(); 
std::string test = buffer.str(); 
std::cout << test << std::endl << std::endl; 
return test; 
} 
// split the given string according to give delimeters 
vector<string> &StrSplit(string inStr, string sepStr, vector<string>  &outStrVec) { 
char * comp; 
char * buffer = new char[ strlen(inStr.c_str()) ]; 
strcpy(buffer, inStr.c_str()); 
comp = strtok (buffer, sepStr.c_str()); 
while (comp != NULL) { 
    outStrVec.push_back(comp); 
    comp = strtok (NULL, sepStr.c_str()); 
} 
delete[] comp; 
delete[] buffer; 
return outStrVec; 
} 

vector<string> StrSplit(string inStr, string sepStr) { 
vector<string> outStrVec; 
return StrSplit(inStr, sepStr, outStrVec); 
![enter image description here][2]} 

int main() { 
Read_from_file(); 
string fileinput = Read_from_file(); 
vector<string> v; 
string inStr = fileinput; 
v = StrSplit(inStr, "|#$ *@.&\"!^01"); 
for (unsigned int i = 0; i < v.size(); ++i) { 
    cout << v[i] << '\n'; 
} 

}

+0

Например, если я использую inStr = "bob010101 ******* was * .... there"; v = StrSplit (inStr, "| # $ * @. & \"!^01 "); на ouptut я получу (Боб был там), но когда я использую строку, которую я проанализировал из файла, я получил ошибку, показанную на image –

+0

Я не хочу начинать указывать проблемы, потому что вам нужно пойти (забрать хорошую книгу) (http://stackoverflow.com/q/388242/1171191). Но когда вы создаете 'buffer' из' inStr', вы не оставляете место для 'NUL' в конце. – BoBTFish

+0

@BoBTFish не мог понять, что вы имели в виду, объясните, пожалуйста, немного больше, или это будет потрясающе, если вы покажете его в коде. заранее –

ответ

1

Буфер слишком мал, чтобы содержать строку включая завершающий символ 0.

Изменить

char * buffer = new char[ strlen(inStr.c_str()) ]; 

в

char * buffer = new char[ strlen(inStr.c_str()) + 1]; 

И не называйте delete на указатели вы не new (удалить delete[] comp).

На самом деле, я бы никогда не использовал strtok в C++.

+0

спасибо, что он работает. Между тем tanx для Bob также за ваше время. оцените свою помощь. –

Смежные вопросы