Reversing order of words in a sentence

后端 未结 8 1254
伪装坚强ぢ
伪装坚强ぢ 2020-12-04 02:11
#include 
#include 
using namespace std;
void reverse(char* sentence)
{
    int index = strlen(sentence) - 1;
    char last = \'\\0\';         


        
相关标签:
8条回答
  • 2020-12-04 02:24

    When you say

    index = hold;
    

    You hav ean infinite loop. You're always going back to the point where you find your '\0' character I believe. What you should do is have two separate while loops. One to get you to the end of your character array, to find '\0'. And then another set of loops to return back to white space, then loop back forward printing out characters.

    NOTE: I like all the answers presented better, but this is why the code you posted is failing. Here is a version of this function that works with just cstrings.

    void reverse(char* sentence, const int START)
    {
        if(sentence[START] == '\0') return;
        char last = '\0';
        int hold = 0;
        int index = START + 1;
    
    
        while(sentence[index] != '\0' && sentence[index] != ' ') {//There are better ways to do this logic, but I wanted to remain true to your implementation as much as possible
            index++;
        }
    
        reverse(sentence, index);
        for(int j = START; j < index; j++) {
            cout << sentence[j];
        }
        cout << endl;
        return;
    }
    

    I prints out a few extra end lines, you can of course format the output however you like, the hard part is done.

    0 讨论(0)
  • 2020-12-04 02:35

    I would like to use stack. 1.Tokenize the string using delimiter("") 2. push the word into the stack 3. As you pops up, store that word in the new string variable.

    0 讨论(0)
  • 2020-12-04 02:41

    As the other answers suggest you should use std::string which can save lot of hassles. But just for the note,

    void reverse(char* sentence)
    {
        int index = strlen(sentence) - 1,hold,last = '\0';
        /*For the 1st iteration last is `\0` for all others it is ` `*/
        while (index >= 0)
        {
            /*
            In your original code,
            This while loop(below) will continue to keep decrementing index 
            even below `0`,You wont exit this while loop until you encounter a ` `.
            For the 1st word of the sentence you will never come out of the loop.
            Hence the check, index>=0
            */
    
            while (index>=0 && sentence[index] != ' ')
            index--;
    
        /* You can print the whitespace later*/
    
        hold = index - 1;  // This keeps track of the last character 
                           // of preceding word 
    
        index++; //character after space
    
            while (sentence[index] != last)
        {
                cout << sentence[index]; 
                index++;
            }
        last = ' '; 
            index = hold; 
    
            /* Dont print space after 1st word*/
        if(index > 0)
        cout<<" ";
        }
    
    }
    int main()
    {
        char* sentence = new char[256];
        cin.getline(sentence, 256);
        reverse(sentence);
        delete[] sentence; // Delete the allocated memory
    }
    

    Tryin to keep it as close to your logic

    0 讨论(0)
  • 2020-12-04 02:42

    Correction to the earlier version, firmly tongue-in-cheek :)

    Note that the program reads all of stdin, treating each individual line as a 'sentence'.

    #include <boost/spirit/include/qi.hpp>
    #include <boost/spirit/include/phoenix.hpp>
    
    namespace phx= boost::phoenix;
    using namespace boost::spirit::qi;
    
    int main()
    {
        auto out = std::ostream_iterator<std::string>(std::cout, " ");
    
        boost::spirit::istream_iterator f(std::cin), l;
        std::cin.unsetf(std::ios::skipws);
    
        parse(f, l, 
                (
                  (as_string [ +~char_("\n\t ") ] % +char_("\t ")) 
                        [ phx::reverse(_1), phx::copy(_1, phx::ref(out)) ]
                ) % eol [ phx::ref(std::cout) << "\n" ]
             );
    }
    
    0 讨论(0)
  • 2020-12-04 02:44

    You can do it by istringstream class of C++

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        string s,st,w;
        int i;
        getline(cin,s);
        istringstream is(s);
        st="";
        is>>st;
        while(is>>w)
        {
            st=w+' '+st;
        }
        cout<<st<<endl;
        return 0;
    
    }
    
    0 讨论(0)
  • 2020-12-04 02:45

    Here I used splitting (tokenizing) sentence into words and then use that for reverse printing. Hope this help-

    #include<iostream>
    #include<string>
    #include<algorithm>
    #include<vector>
    using namespace std;
    
    vector<string> split(char* str, char delimiter=' ')
    {
            vector<string> result;
            do
            {
                    char* begin =str;
                    while(*str != delimiter && *str)
                            str++;
                    result.push_back(string(begin, str));
            }while(0 != *str++);
            return result;
    }
    int main()
    {
            string str;
            vector<string> tempStr;
            cout<<"Enter The String: ";
            getline(cin, str);
            cout<<endl;
            tempStr=split((char*)str.c_str());
            str.clear();
            cout<<"Final Reverse: \n";
            for(int i=tempStr.size()-1; i>=0; i--) str+=tempStr.at(i)+" ";
                    //cout<<tempStr.at(i)<<" ";
            cout<<str<<endl;
            return 0;
    }
    
    0 讨论(0)
提交回复
热议问题