Strtok возвращает дополнительные данные в конце строки

Я часами возился с этим кодом и ищу несколько советов. Я использую strtok для получения слов из строки, но я продолжаю получать дополнительные данные в конце каждой строки. У меня есть следующий код:

cout << "\n\n6. Load File:\n";
getline(cin, inFile);
inFile = path + inFile;
myfile.open(inFile.c_str());
while (myfile.is_open() == false)   //check to make sure file exists
{
cout << "\nPlease enter in a valid file name: ";
getline(cin,inFile);
inFile = path + inFile;
myfile.open(inFile.c_str());
}
getline (myfile,line);
while ( myfile.good() )     //while the file is running, run below code
{
getline (myfile,line);
//cout << line;
char str[line.length()];
char * pch;
for (int i=0;i<line.size();i++) { //creates a char array from characters
str[i]=line[i];
}
pch = strtok(str," ,-!?\r\t\f\v\n\0|/\\_"); //eliminates whitespace,etc in char array
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,-!?\r\t\f\v\n\0|/\\_");  //grabs next word
}

}
myfile.close();

Теперь этот код дает мне желаемый вывод слова, но со случайными сумасшедшими значениями из памяти в конце каждой строки. Увидеть ниже:

Загрузить файл:
cars1.txt
драндулет
синий
3402,99\ 244 \ 363P
ржавый
коричневый
44,99п
Лимон
желтый
4226,9999p

Пожалуйста, помогите и большое спасибо!

1

Решение

В CСтроки должны иметь NUL (0) в конце. Вы должны добавить это.

(Это также означает, что \0 в вашей лексеме строка считается концом этой строки, а следующие символы будут игнорироваться. Это сделает это соответствующим вашему комментарию о пробелах, но это может быть не то, что вы действительно хотите.)

Самое простое решение: использовать strdup дублировать вашу строку.

char* tmp_copy = strdup(line.c_str());
for (char* pch = strtok(tmp_copy," ,-!?\r\t\f\v\n\0|/\\_");
pch;
pch = strtok (NULL, " ,-!?\r\t\f\v\n\0|/\\_")) {
printf ("%s\n",pch);
}
free(tmp_copy);

Лучшее решение: использовать повышение :: Tokenizer.

1

Другие решения

Вам нужно завершить ноль str, Вы копируете line в str один символ за раз, но не завершающий ноль.

Попробуй это:

char str[line.length()+1];
char * pch;
for (int i=0;i<line.size();i++) {
str[i]=line[i];
}
str[line.size()+1] = '\0';     // null terminator

Или проще, просто инициализируй str:

char str[line.length()+1] = {};  // initialize to all nulls
char * pch;
for (int i=0;i<line.size();i++) {
str[i]=line[i];
}
0

По вопросам рекламы [email protected]