2016-03-31 4 views
1

Я попросил пользователя ввести строку в основной функции в моей программе и сохранить ее userString и хочу показать, сколько слов есть.Как подсчитать количество слов в строке?

Это функция, которую я намерен позвонить из основных:

int countWords(string d) { 
    string words = " "; 
    for (int e = 0; e < d.length(); e++) { 
     if (isspace(d[e])) { 
      cout << "The string " << words << "word(s). "; 
     } 
    } 
    return words; 
} 

Я где-то читал, что функция должна фактически подсчитать количество пробелов (поэтому я использовал isspace()), а не сами слова ,

Как мне подсчитать количество слов в строке и отобразить их в одной и той же функции? У меня проблемы с этим, и я получаю ошибки.

Я также не могу использовать библиотечные функции.

Ожидаемый результат:

  • Строка "2020" имеет одно слово.
  • Строка «Привет, ребята» имеет два слова.
+2

Я предлагаю вам добавить 'int count = 0;' поверх вашей функции, а затем выполнить свой собственный экзамен ples (и, возможно, еще пара) на бумаге, воображая, что должно произойти с 'count', когда вы сталкиваетесь с каждым значением' d [e] '. Если вы не знаете, как выразить это в коде, тогда это будет лучший вопрос, но я уверен, что вы можете разработать какую-то логику/алгоритм для того, как человек будет обрабатывать количество слов, а я Я не вижу попыток выразить, чем в вашем текущем коде. Подсказка: вы можете быть заинтересованы в переходах из космоса в буквы и обратно (т.е. 'isspace (d [e]) &&! Isspace (d [e-1])'. –

+0

ваша функция не делает никакого подсчета и просто выводит пробелы –

ответ

1

Если вы не хотите использовать импульс, простой цикл будет делать.

#include <cctype> 

... 

for(int i = 0; i < toParse.length(); i++){ 
    if (isblank(toParse[i])){ 
     //start new word 
    } 
    else if (toParse[i] == '.'){ 
     //start new sentence 
    } 
    else if (isalphanum(toParse[i])){ 
     //add to your current word 
    } 
} 

редактировать: вы можете просто увеличивать целое, где вы видите //start new word.

0

попробовать boost::split(), который поставит слова в вектор

+0

использовать библиотеку только для того, чтобы получить количество слов? Не считаете ли вы, что это вызовет слишком много накладных расходов? –

+0

Мне не разрешено использовать библиотечные функции, я получаю очки от задания, если я это сделаю. – programmingstuffs

+0

Даже не закрывать Я сделал большую часть этого. У меня проблемы с этой функцией - все. Как я когда-либо подразумевал, что я хотел, чтобы вы сделали домашнее задание? Мне нужна помощь, не для чего этот форум предназначен? – programmingstuffs

0

Кроме того, если вы хотите посчитать что-то в диапазоне, удовлетворяющих некоторому условию, вы можете думать в std::count_if

Пример:

int countWords(std::string d) 
{ 
    int w = std::count_if(d.begin(), d.end(), [](char ch) { return isspace(ch); }); 
    std::cout << "The string \"" << d << "\" has " << w + 1 << " words." << '\n'; 
    return w; 
}