Разделение строки в С++

Я пишу функцию для перестановки слов в строке. Моя идея состоит в том, чтобы разбить строку на ' ', поместить слова в стек и вытолкнуть их, чтобы напечатать строку с перевернутыми словами.

Но я не могу разбить строку с помощью класса stringstream.

Мой код выглядит следующим образом:

#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<stack>
#include<string>
#include<bits/stdc++.h>

using namespace std;


void reverse_words(string s){

    stack <string> stack_words;

    string popped_element;

    string result = "";

    stringstream split(s);

    string token;

    while(getline(split,token,' ')){

        cout<<"pushed "<<token;
        stack_words.push(token);
    }

    while(!stack_words.empty()){

        popped_element = stack_words.top();
        stack_words.pop();

        result.append(" ");
        result.append(popped_element);

    }

    cout<<result;

}



int main(){

    string s,res;

    cout<<"\n Enter a string :";
    cin>>s;

    reverse_words(s);

}


Например, когда я ввожу «Hello World», в стек помещается только «Hello», тогда как мне нужно, чтобы в стеке присутствовали «Hello» и «World».

Кто-нибудь знает, что не так с моим кодом?


person AnonymousMe    schedule 22.12.2020    source источник
comment
Cin перестает читать после пробела, поэтому s — это просто Hello   -  person DevUt    schedule 22.12.2020
comment
Спасибо, теперь я понимаю проблему.   -  person AnonymousMe    schedule 22.12.2020
comment
@DevUt — экстракторы потока (operator>>) перестают читать на пробеле. Другие операции ввода, включая getline, этого не делают.   -  person Pete Becker    schedule 22.12.2020
comment
Несвязанный: прочитайте Почему я не должен #include ‹bits/stdc++.h› ? и освободитесь от карго-культа.   -  person user4581301    schedule 22.12.2020


Ответы (2)


В вашем случае экстрактор потока (operator >>) перестает читать после пробела в Hello world, поэтому s="Hello". Чтобы решить эту проблему, используйте getline(cin,s);

Отредактировано, чтобы включить более подробную информацию, как сказал @Pete Becker

person DevUt    schedule 22.12.2020
comment
std::cin не принимает решения о том, когда прекратить чтение. Это operator>> перестает читать. +1. - person Pete Becker; 22.12.2020
comment
@PeteBecker Спасибо, чувак, это то, что я добавляю в свой круг знаний. - person DevUt; 22.12.2020

Как насчет этого?

#include <bits/stdc++.h>
#include <iostream>

using namespace std;

void reverseWords(string s)
{
    vector<string> tmp;

    string str = "";

    for (int i = 0; i < s.length(); i++) 
    {
        if (s[i] == ' ') 
        {
            tmp.push_back(str);
            str = "";
        }
        else
            str += s[i];
    }
    tmp.push_back(str);
    int i;
    for (i = tmp.size() - 1; i > 0; i--)
        cout << tmp[i] << " ";

    cout << tmp[0] << endl;
}

int main()
{
    string s;
    getline(cin,s);
    reverseWords(s);
    return 0;
}
person secdet    schedule 22.12.2020
comment
Жесткое кодирование строки не является хорошим подходом, в конце концов, программа требует пользовательского ввода, мы просто не хотим проходить тестовые случаи. - person DevUt; 22.12.2020
comment
о, извините, я перечитал это - person secdet; 22.12.2020
comment
Спасибо за ответ, хотя я пытался понять, что не так с моим кодом :) - person AnonymousMe; 22.12.2020