Не работает функция подсчета слов в строке при работе с файлом

103
25 января 2020, 21:40

Необходимо посчитать количество слов в каждой строке для дальнейших действий. Функция работает с обычной строкой, а вот при передаче ей буфера, в котором содержится ( или должна содержаться строка из файла) функция не работает и всё время возвращает 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;
    }
}
Answer 1

Из описания 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;
}
READ ALSO
Что сделать чтобы в конструкторе не было много параметров

Что сделать чтобы в конструкторе не было много параметров

Всем привет! Есть такой конструктор который считывает информацию о квартире:

131
Как скопировать строку из одного метода в другой

Как скопировать строку из одного метода в другой

У меня есть два класса, один из которых mainВ последнем хранится переменная Name

149
Проблема с flat jar - Could not find or load class. Error

Проблема с flat jar - Could not find or load class. Error

Пытаюсь собрать запускаемый flat jar с помощью maven, каждый раз натыкаюсь на граблиЯ собрал все то что нагуглил/подсказали в кучу и засунул в корневой...

126