Необходимо посчитать количество слов в каждой строке для дальнейших действий. Функция работает с обычной строкой, а вот при передаче ей буфера, в котором содержится ( или должна содержаться строка из файла) функция не работает и всё время возвращает 1. Вроде примитивное задание, но ошибку найти не могу. Стринги, пожалуйста, не предлагать.
Код:
int CountWords(char str[]) {
int counter = 0;
char* c = strtok(str, " ");
while (c) {
c = strtok(NULL, " ");
counter++;
}
return counter;
}
void DeleteMaxWords(const char path[]) {//здесь ищу строку с макисмальным количеством слов
ifstream f(path);
char buf[50];
int i = 0;
int _strNum = 0;
int _maxWords = 0;
while ( !f.eof() ) {
f.getline(buf, 50);
if (CountWords(buf) > _maxWords) {
cout << CountWords(buf) << endl;
_maxWords = CountWords(buf);
_strNum = i;
}
++i;
//cout << _maxWords << endl;
}
}
Из описания strtok:
This function is destructive: it writes the '\0' characters in the elements of the string str. In particular, a string literal cannot be used as the first argument of strtok.
Соответственно, пробелы становятся '\0' и второй проход читает только одно слово. Как исправить? Вызвать один раз перед if и записать в переменную и дальше использовать переменную, да и зачем вызывать алгоритм 10 раз подряд, когда можно только 1 раз. К тому же есть ещё одно ошибка.
Неправильно:
while ( !f.eof() ) {
f.getline(buf, 50);
...
}
Потому что f.eof() будет true только после попытки чтения, когда конец файла был достигнут.
while (f.getline(buf, 50)) {
int k = CountWords(buf);
if (k > _maxWords) {
cout << k << endl;
_maxWords = k;
_strNum = i;
}
++i;
//cout << _maxWords << endl;
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Всем привет! Есть такой конструктор который считывает информацию о квартире:
У меня есть два класса, один из которых mainВ последнем хранится переменная Name
Пытаюсь собрать запускаемый flat jar с помощью maven, каждый раз натыкаюсь на граблиЯ собрал все то что нагуглил/подсказали в кучу и засунул в корневой...