Как разбить предложение любой длины на слова и сохранить их в переменных c ++ - PullRequest
1 голос
/ 27 марта 2020

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

Вот пример кода:

void spilt_sentence(string sentence)
{}
int main()
{
   std::string sentence1= "Hello everyone";
   std::string sentence2= "Hello I am doing stuff";
   split_sentence(sentence1);
   split_sentence(sentence2);
   return 0;
}

Я видел кто-то использует std :: istringstream, чтобы получить каждое слово перед каждым пробелом, но я не знаю, как это работает. Это дает мне ошибку, когда я помещаю std :: istringstream ss (предложение); в коде. Кроме того, я использую C ++ 98, и я компилирую свою программу с помощью Cygwin. Какие-либо ведет? Спасибо.

Редактировать: функция создаст несколько переменных в зависимости от количества слов в предложении.

Редактировать: я на самом деле работаю над программой LinkedList и чем я занимаюсь попытка сделать это - разделить предложение на слова, а затем сгенерировать новые узлы, содержащие каждое слово.

Вот фактический код (примечание: я немного его изменил, поэтому он не совсем совпадает с моим реальным). Я не использую struct для Node), и скажем, предложение 1 «Привет всем», а предложение 2 «Привет, я делаю вещи».

The expected output will be:
linkedlist1:
"hello"<->"everyone"
linkedlist2:
"hello"<->"I"<->"am"<->"doing"<->"stuff"

внутри LinkedList. cpp:

void LinkedList::add(std::string sentence)
{
   //breaks down the sentence into words
   std::istringstream ss(sentence);
   do
   {
       std::string word;
       ss >> word;

       //store them in nodes in a linkedlist
       Node* new_tail = new Node(word);
       if (size == 0)
       {
           head = new_tail;
           tail = new_tail;
       }
       else
       {
           new_tail->set_previous(tail);
           tail->set_next(new_tail);
           tail = new_tail;
       }
       new_tail = NULL;
       size++;

   }
   while(ss);
}

[FIXED] При компиляции появляется сообщение об ошибке, в котором говорится, что std :: istringstream ss имеет настройки по умолчанию, но тип является неполным. Что мне делать?

ошибка

1 Ответ

0 голосов
/ 27 марта 2020

Вот функция, использующая потоки, эта функция будет работать только для векторов, вы не можете использовать эту функцию для массивов, но если вы хотите, вы можете изменить ее для себя. Вот код и пример использования

#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>
#include <iostream>
using namespace std;

void split_sentence(const string& str, vector<string>& cont)
{
    istringstream iss(str);
    copy(istream_iterator<string>(iss),
         istream_iterator<string>(),
         back_inserter(cont));


     //checking for punctuation marks and if found, we remove them from the word
     for(int i = 0, sz = cont.size(); i < sz; i++){
        string word = cont.at(i);
        for(int j = 0, len = word.length(); j < len; j++){
            if(ispunct(word[j])){
                cont.at(i) = word.substr(0, word.length() - 1);
            }
        }
     }
}

int main(){

    string sentence = "this is a test sentence for stackoverflow!";
    vector<string> words;

    split_sentence(sentence, words);

    for(int i = 0, sz = words.size(); i < sz; i++){
        cout<<words.at(i) << endl;
    }

    return 0;

}

И это вывод

this
is
a
test
sentence
for
stackoverflow

, если вы также хотите напечатать знаки препинания, затем удалите double для l oop в функции.

...