JuniorКодЧастоЕщё не отвечали
Реализуйте подсчёт слов в предложении
Дано предложение. Верните количество слов в нём. Слова разделяются пробельными символами.
Требования:
- Корректно обрабатывайте несколько пробелов подряд и ведущие/завершающие пробелы.
- Пустая строка (и строка из одних пробелов) содержит 0 слов.
#include <string>
int countWords(const std::string& s) {
// ваш код здесь
}
Допишите реализацию.
Сканируйте строку, отслеживая, был ли предыдущий символ пробелом. Каждый переход от пробела к непробелу увеличивает счётчик слов. Корректно обрабатывайте множественные пробелы и ведущие/завершающие пробелы.
- ✗Считать пробелы вместо переходов от пробела к непробелу — даёт неверный результат при нескольких пробелах подряд
- ✗Ошибка на единицу: не считать последнее слово, если строка не заканчивается пробелом
- ✗Не обрабатывать случай пустой строки
- →Как подсчитать уникальные слова в предложении?
- →Как разбить строку по произвольному разделителю?
Оглавление
Задача
Напишите функцию, подсчитывающую количество слов в предложении. Слова разделяются пробелами (возможны множественные).
Решение
#include <string>
#include <sstream>
#include <cctype>
#include <cassert>
// Подход 1: отслеживаем переходы пробел → непробел
int countWords(const std::string& s) {
int count = 0;
bool inSpace = true; // начинаем как "были в пробеле"
for (char c : s) {
if (std::isspace(c)) {
inSpace = true;
} else if (inSpace) {
++count;
inSpace = false;
}
}
return count;
}
// Подход 2: idiomatic C++ через istringstream
int countWordsStream(const std::string& s) {
std::istringstream iss(s);
std::string word;
int count = 0;
while (iss >> word) ++count;
return count;
}
int main() {
assert(countWords("Hello World") == 2);
assert(countWords(" hello world ") == 2);
assert(countWords("") == 0);
assert(countWords(" ") == 0);
assert(countWords("one") == 1);
assert(countWords("a b c d e") == 5);
assert(countWordsStream("Hello World") == 2);
assert(countWordsStream(" hello world ") == 2);
}
Ключевые моменты
- Считайте переходы «пробел → непробел», а не сами пробелы.
std::istringstream+operator>>автоматически пропускает пробелы.- Подход с переходами не требует выделения памяти.
Оглавление