Я часами возился с этим кодом и ищу несколько советов. Я использую 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
Пожалуйста, помогите и большое спасибо!
В 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.
Вам нужно завершить ноль 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];
}