Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Nickolay0512
57 / 39 / 41
Регистрация: 26.09.2013
Сообщений: 317
Записей в блоге: 1
#1

Найти количества слов в строке - C++

11.10.2014, 08:23. Просмотров 1290. Ответов 18
Метки нет (Все метки)

Здравствуйте. Как найти число слов в строке string, при условии что слова могут разделяться несколькими пробелами?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2014, 08:23
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Найти количества слов в строке (C++):

Подсчёт количества слов в строке
Помогите разобраться в проблемке. Программа должна считывать текст из файла по...

Нахождение количества слов в строке
Задается строка S состоящая из латинских букв и пробелов. Найти количество слов...

Подсчет количества слов в строке
Помогите пожалуйста написать программу для подсчета количества слов в строке

Доработка программы (Подсчет количества слов в строке)
Нужно подсчитать количество слов в строке s разделенных пробелами, или запятой....

Как сделать поиск количества слов в строке
Здравствуйте подскажите как сделать поиск количества слов В стрингах. ...

Определение количества слов четной длины в строке
Помогите пожалуйста,при выполнении данного коды выдаётся ошибка, помогите...

18
sergestus
77 / 77 / 34
Регистрация: 26.10.2011
Сообщений: 220
Завершенные тесты: 1
11.10.2014, 09:14 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <regex>
#include <string>
 
using namespace std;
 
int main()
{
  string inputString = 
    "Humpty Dumpty sat on a wall,\n"
    "Humpty Dumpty had a great fall.\n"
    "All the king's horses and all the king's men\n"
    "Couldn't put Humpty together again.\n";
 
  regex expression("([^\\s]+)"); 
  sregex_token_iterator first(inputString.begin(), inputString.end(), expression); 
  sregex_token_iterator last;
 
  cout << inputString << endl << endl;
  cout << "The count of words: " << distance(first,last) << endl;
 
  system("pause");
  return 0;
}
2
Nickolay0512
57 / 39 / 41
Регистрация: 26.09.2013
Сообщений: 317
Записей в блоге: 1
11.10.2014, 09:17  [ТС] #3
sergestus, а как-нибудь попроще можно?)
0
sergestus
77 / 77 / 34
Регистрация: 26.10.2011
Сообщений: 220
Завершенные тесты: 1
11.10.2014, 09:24 #4
увы, нет, будет только сложнее...
0
Nickolay0512
57 / 39 / 41
Регистрация: 26.09.2013
Сообщений: 317
Записей в блоге: 1
11.10.2014, 09:26  [ТС] #5
sergestus, добавьте пожалуйста комментарии, а то знакомо только cout, cin и string)
0
0x10
2554 / 1734 / 285
Регистрация: 24.11.2012
Сообщений: 4,361
11.10.2014, 09:28 #6
Цитата Сообщение от sergestus Посмотреть сообщение
увы, нет, будет только сложнее...
Проще не для реализации, а для восприятия. Очевидно же, что задание учебное и никто не ждет использования регулярок. Вполне можно набросать простенький автомат с состояниями {начало, слово, разделитель} и считать переходы в состояние "слово".
0
sergestus
77 / 77 / 34
Регистрация: 26.10.2011
Сообщений: 220
Завершенные тесты: 1
11.10.2014, 09:49 #7
Пожалуйста:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <regex>
#include <string>
 
using namespace std;
 
int main()
{
  string inputString = 
    "Humpty Dumpty sat on a wall,\n"
    "Humpty Dumpty had a great fall.\n"
    "All the king's horses and all the king's men\n"
    "Couldn't put Humpty together again.\n";
 
  // Регулярное выражение (шаблон) для поиска слова в строке
  regex expression("([^\\s]+)"); 
 
  // Для перебора слов в строке используются итераторы (указатели): 
  // first - итератор первого слова
  // last - итератор последнего слова 
  sregex_token_iterator first(inputString.begin(), inputString.end(), expression); 
  sregex_token_iterator last;
 
  // Выводим исходную строку:
  cout << inputString << endl << endl;
 
  // Для поиска количества слов используем метод distance -
  // количество слов между первым и последним словом
  cout << "The count of words: " << distance(first,last) << endl;
 
  system("pause");
  return 0;
}
Добавлено через 3 минуты
0x10,

Проще не для реализации, а для восприятия. Очевидно же, что задание учебное и никто не ждет использования регулярок. Вполне можно набросать простенький автомат с состояниями {начало, слово, разделитель} и считать переходы в состояние "слово".
К сожалению не имею педагогического образования (:
2
Nickolay0512
57 / 39 / 41
Регистрация: 26.09.2013
Сообщений: 317
Записей в блоге: 1
11.10.2014, 09:50  [ТС] #8
0x10, может вы предложите алгоритм попроще?
0
0x10
2554 / 1734 / 285
Регистрация: 24.11.2012
Сообщений: 4,361
11.10.2014, 10:04 #9
Цитата Сообщение от Nickolay0512 Посмотреть сообщение
может вы предложите алгоритм попроще?
Пусть есть переменная - состояние, state. Она может принимать значения None, Word, Delimiter. В начале работы - None.
Пусть есть счетчик word_counter = 0.
На вход посимвольно подается строка.
Если мы находимся в состоянии None и на входе символ, то переходим в состояние Word, увеличиваем счетчик.
Если мы находимся в состоянии Word и на входе разделитель - переходим в состояние Delimiter.
Из состояния Delimiter при поступлении на вход символа переходим в состояние Word и увеличиваем счетчик.

Ну и так нужно продолжить до всех вариантов перехода и выхода. Логика ясна?
1
Nickolay0512
57 / 39 / 41
Регистрация: 26.09.2013
Сообщений: 317
Записей в блоге: 1
11.10.2014, 10:06  [ТС] #10
0x10, а что такое переменная-состояние?
0
0x10
2554 / 1734 / 285
Регистрация: 24.11.2012
Сообщений: 4,361
11.10.2014, 10:09 #11
Цитата Сообщение от Nickolay0512 Посмотреть сообщение
а что такое переменная-состояние?
Переменная, которая хранит текущее состояние автомата Оо. Реализована может быть как целочисленная переменная или enum.
enum State { None, Word, Delimiter };
1
8Observer8
2040 / 1333 / 217
Регистрация: 05.10.2013
Сообщений: 4,232
Записей в блоге: 56
11.10.2014, 11:06 #12
Извините за оффтоп

sergestus, как сделать так чтобы работала и стандартная форма записи regexp? Что-то типа такого: http://regexr.com/39mgi

Я только знакомлюсь с регурярками по книге Форты

У меня даже цифру не хочет искать:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <regex>
#include <string>
#include <iostream>
 
int main()
{
    std::string str = "Hello my 5 compluter!";
 
    try {
        const std::regex e( "\d", std::regex_constants::basic );
        std::sregex_iterator next( str.begin(), str.end(), e );
        std::sregex_iterator end;
        while ( next != end ) {
            std::smatch match = *next;
            std::cout << match.str() << "\n";
            next++;
        } 
    } catch ( const std::regex_error &e ) {
        std::cerr << "Error: incorrect regular expression" << std::endl;
        return 1;
    }
 
    return 0;
}
Добавлено через 7 минут
Nickolay0512 вам в клубе программистов ответил красиво Rififi:

C++
1
2
3
4
5
6
7
8
std::string text = "...";
 
std::stringstream ss(text);
std::string word;
 
size_t words = 0;
while (ss >> word)
    words++;
1
sergestus
77 / 77 / 34
Регистрация: 26.10.2011
Сообщений: 220
Завершенные тесты: 1
11.10.2014, 11:33 #13
Нужно добавить еще один обратный слеш в строку, так как символ '\' в с++ записывается как '\\' и убрать флаг std::regex_constants::basic, так как он задает набор мета символов, в которых нет \d (а по умолчанию там расширенный набор):
const std::regex e( "\\d", std::regex_constants::basic );
1
8Observer8
2040 / 1333 / 217
Регистрация: 05.10.2013
Сообщений: 4,232
Записей в блоге: 56
11.10.2014, 11:34 #14
С моим вопросом вот здесь подсказали: http://www.cplusplus.com/forum/beginner/144594/

Приведу свой вариант, так как здесь есть несколько полезностей:

Output:
Hello my compumyter!
n = 3
Press any key to continue . . .
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <regex>
#include <string>
#include <iostream>
 
int countWords(  const std::string &str );
 
int main()
{
    const std::string str = "Hello    my     compumyter!";
 
    int n = 0;
    try {
        n = countWords( str );
    } catch ( const std::regex_error &e ) {
        std::cerr << "Error: incorrect regular expression" << std::endl;
        return 1;
    }
 
    std::cout << str << std::endl;
    std::cout << "n = " << n << std::endl;
 
    return 0;
}
 
int countWords( const std::string &str )
{
    std::smatch sm;
    int n = 0;
    
    try {
        const std::regex e( "\\b\\w+\\b" );
        std::sregex_iterator next( str.begin(), str.end(), e );
        std::sregex_iterator end;
        while ( next != end ) {
            next++;
            n++;
        } 
    } catch ( const std::regex_error &e ) {
        throw;
    }
 
    return n;
}
0
Nickolay0512
57 / 39 / 41
Регистрация: 26.09.2013
Сообщений: 317
Записей в блоге: 1
11.10.2014, 11:35  [ТС] #15
sergestus, а в вашем коде \s что такое?
0
sergestus
77 / 77 / 34
Регистрация: 26.10.2011
Сообщений: 220
Завершенные тесты: 1
11.10.2014, 11:41 #16
Цитата Сообщение от Nickolay0512 Посмотреть сообщение
а в вашем коде \s что такое?
Это все что может находится между словами (пробелы, переносы строки и.т.д.). Вообще есть очень удобный online калькулятор, в котором можно быстро проверять свои выражения... там есть краткая справка по всем спец. символам (рекомендую): http://rubular.com/
2
8Observer8
2040 / 1333 / 217
Регистрация: 05.10.2013
Сообщений: 4,232
Записей в блоге: 56
11.10.2014, 12:32 #17
Nickolay0512, рекомендую вам: Бен Форта - Регулярные выражения. 10 минут на урок
1
DiffEreD
1441 / 778 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
11.10.2014, 13:03 #18
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <vector>
#include <iterator>
#include <string>
#include <sstream>
 
int main()
{
    std::string text{"All the king's horses and all the king's men"};
    std::istringstream iss{text};
    std::cout << "Cont of words: "
               << std::vector<std::string>{
                  std::istream_iterator<std::string>(iss),
                  std::istream_iterator<std::string>()}.size()
               << "\n";
 
    system("pause");
    return 0;
}
2
8Observer8
2040 / 1333 / 217
Регистрация: 05.10.2013
Сообщений: 4,232
Записей в блоге: 56
11.10.2014, 18:37 #19
Вот такую памятку сделал. Может кому-нибудь ещё пригодится:

Подсчёт слов в тексте с помощью std::stringstream

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

Автор: Rififi

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <string>
#include <sstream>
#include <iostream>
 
size_t countWords( const std::string &text );
 
int main()
{
    const std::string text = "Hello    my   computer!\n"
                             "Hello, World!";
 
    size_t n = countWords( text );
    std::cout << "text = " << text << std::endl;
    std::cout << "n = " << n << std::endl;
 
    return 0;
}
 
size_t countWords( const std::string &text )
{
    std::stringstream ss( text );
    std::string word;
 
    size_t n = 0;
    while( ss >> word ) {
        n++;
    }
 
    return n;
}


Подсчёт слов в тексте с помощью std::istream_iterator

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

Автор: DiffEreD

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <string>
#include <iterator>
#include <vector>
#include <sstream>
#include <iostream>
 
size_t countWords( const std::string &text );
 
int main( )
{
    const std::string text = "Hello    my   computer!\n"
            "Hello, World!";
 
    size_t n = countWords( text );
    std::cout << text << std::endl;
    std::cout << "n = " << n << std::endl;
 
    return 0;
}
 
size_t countWords( const std::string &text )
{
    std::istringstream iss( text );
 
    size_t n = std::vector<std::string> { std::istream_iterator<std::string>( iss ),
        std::istream_iterator<std::string>( ) }
    .size( );
 
    return n;
}


Подсчёт слов в тексте с помощью std::sregex_iterator

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

Автор: 8Observer8

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <regex>
#include <string>
#include <iostream>
 
size_t countWords( const std::string &str );
 
int main( )
{
    const std::string text = "Hello    my   computer!\n"
            "Hello, World!";
 
    size_t n = 0;
    try {
        n = countWords( text );
    } catch ( const std::regex_error &e ) {
        std::cerr << "Error: incorrect regular expression" << std::endl;
        return 1;
    }
 
    std::cout << text << std::endl;
    std::cout << "n = " << n << std::endl;
 
    return 0;
}
 
size_t countWords( const std::string &text )
{
    std::smatch sm;
    size_t n = 0;
 
    try {
        const std::regex e( "\\b\\w+\\b" );
        std::sregex_iterator next( text.begin( ), text.end( ), e );
        std::sregex_iterator end;
        while ( next != end ) {
            next++;
            n++;
        }
    } catch ( const std::regex_error &e ) {
        throw;
    }
 
    return n;
}


Подсчёт слов в тексте с помощью sregex_token_iterator

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

Автор: sergestus

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <regex>
#include <string>
 
using namespace std;
 
int main( )
{
    string inputString =
            "Humpty Dumpty sat on a wall,\n"
            "Humpty Dumpty had a great fall.\n"
            "All the king's horses and all the king's men\n"
            "Couldn't put Humpty together again.\n";
 
    // Регулярное выражение (шаблон) для поиска слова в строке
    regex expression( "([^\\s]+)" );
 
    // Для перебора слов в строке используются итераторы (указатели): 
    // first - итератор первого слова
    // last - итератор последнего слова 
    sregex_token_iterator first( inputString.begin( ), inputString.end( ), expression );
    sregex_token_iterator last;
 
    // Выводим исходную строку:
    cout << inputString << endl << endl;
 
    // Для поиска количества слов используем метод distance -
    // количество слов между первым и последним словом
    cout << "The count of words: " << distance( first, last ) << endl;
 
    system( "pause" );
    return 0;
}


Подсчёт слов в тексте с помощью QRegExp

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

Автор: 8Observer8

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <string>
#include <iostream>
#include <QRegExp>
 
int countWords( const std::string &text );
 
int main( )
{
    const std::string text = "Hello    my   computer!\n"
            "Hello, World!";
 
    int n = countWords( text );
    std::cout << "text = " << text << std::endl;
    std::cout << "n = " << n << std::endl;
 
    return 0;
}
 
int countWords( const std::string &text )
{
    QRegExp re( "\\b\\w+\\b" );
 
    int count = 0;
    int pos = 0;
    while ( ( pos = re.indexIn( QString( text.c_str( ) ), pos ) ) != -1 ) {
        count++;
        pos += re.matchedLength( );
    }
 
    return count;
}
1
11.10.2014, 18:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.10.2014, 18:37
Привет! Вот еще темы с решениями:

Поиск количества слов строке(как можно проще)
Здравствуйте.Я недавно начал изучать с++ и столкнулся с проблемой. Нужно...

Определение в строке количества слов длиннее четырёх символов
Помогите с решением контрольных на C++. Пожалуйста. 2. Разработать...

Поиск заданной буквы в строке. Определения количества слов
В заданной строке определить количество слов, в которых заданная буква...

Подсчет количества слов в строке s разделенных пробелами, или запятой
Нужно написать простую программку на C или C + + ... Подсчет количества слов в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru