Как читать предложение в C++? [требует правки]

386
13 января 2017, 09:28

Как можно прочитать введенное в программу предложение и переместить слова в вектор строк?

Answer 1

Для этого используется стандартная функция std::getline для считывания предложений и строковый поток std::istringstream для разбиения каждого предложения на отдельные слова.

Ниже представлена демонстрационная программа. В ней ввод продолжается до тех пор, пока пользователь не введет пустую строку, то есть когда он просто не нажмет клавишу Enter без ввода текста предложения.

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <iterator>
int main() 
{
    std::vector<std::vector<std::string>> v;
    std::cout << "Enter a sequence of sentences (Enter - exit): ";
    std::string s;
    while ( std::getline( std::cin, s, '\n' ) && !s.empty() )
    {
        std::istringstream is( s );
        std::vector<std::string> row( ( std::istream_iterator<std::string>( is ) ),
                                      std::istream_iterator<std::string>() );
        v.push_back( row );                                   
    }
    std::cout << std::endl;
    for ( const auto &row : v )
    {
        for ( const auto &s : row ) std::cout << s << ' ';
        std::cout << std::endl;
    }
    return 0;
}

Если ввести через консоль следующие предложения

Hello, everybody!
How do you do?

то вывод на консоль будет следующим

Enter a sequence of sentences (Enter - exit): Hello, everybody!
How do you do?
Hello, everybody! 
How do you do? 
Answer 2

Так ведь что считать словами...

Например, что является предложением и какие слова во введенном тексте

- Привет! - сказала она. - Я не понимаю,
как считывать слова в вектор. Ты не поможешь?

Можно считать всю строку с помощью getline() и разобрать ее на слова - скажем, с помощью strtok(). А может, предложение не ограничено одной строкой?

Можно понимать слова в понимании C++, и считывать их по одному с помощью

string word;
...
cin >> word;

и отслеживать, где заканчивается "предложение" - например, точкой.

Можно вообще считывать по одному символу и разбираться - это еще слово, или уже пунктуация/пробел?

Словом, без абсолютно точного ТЗ результат обычно ХЗ...

Answer 3

Хотя бы вот так:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
int main() {
    std::vector<std::string> v;
    std::copy(std::istream_iterator<std::string>(std::cin), {}, std::back_inserter(v));
    std::copy(std::begin(v), std::end(v), std::ostream_iterator<std::string>(std::cout, " - "));
}

Если под "предложением" понимается последовательность слов, разделённых пробельными символами.

READ ALSO
Может ли double понимать числа с &#39; , &#39; вместо &#39; . &#39;?

Может ли double понимать числа с ' , ' вместо ' . '?

Доброго времени сутокРеализую калькулятор в Qt

272
Qt. Передача данных между двумя классами

Qt. Передача данных между двумя классами

Есть два окнаВ одном окне LineEdit, в другом - PushButton

448
Какие технологии Boost уже были включены в официальную спецификацию C++ 11? [требует правки]

Какие технологии Boost уже были включены в официальную спецификацию C++ 11? [требует правки]

Какие технологии Boost были включены и реализованы в stdlib C++ 11?

262
Вывод дробной части от логарифма C++

Вывод дробной части от логарифма C++

Необходимо определить, является ли логарифм a по основанию b целымМое решение: cout<<fmod(log(a)/log(b),1); Но, например, при тесте a=46656 b=6, программа...

285