简体   繁体   中英

c++ string manipulation reversal

I am currently doing c++ and am going through how to take in an sentence through a string and reverse the words (This is a word......word a is This etc)

I have looked at this method:

static string reverseWords(string const& instr)
{
    istringstream iss(instr);
    string outstr;
    string word;
    iss >> outstr;
    while (iss >> word)
    {
        outstr = word + ' ' + outstr;
    }
    return outstr;
}

int main()
{
    string s;
    cout << "Enter sentence: ";
    getline(cin, s);

    string sret = reverseWords(s);
    cout << reverseWords(s) << endl;

    return 0;
}

I have gone through the function and kind of understand but I am a bit confused as to EXACTLY what is going on at

iss >> outstr;

while (iss >> word)
    {
        outstr = word + ' ' + outstr;
    }
    return outstr;

Can anybody explain to me the exact process that is happening that enables the words to get reversed?

Thank you very much

iss is an istringstream, and istringstreams are istreams.

As an istream, iss has the operator>> , which reads into strings from its string buffer in a whitespace delimeted manner. That is to say, it reads one whitespace separated token at a time.

So, given the string "This is a word", the first thing it would read is "This". The next thing it would read would be "is", then "a", then "word". Then it would fail. If it fails, that puts iss into a state such that, if you test it as a bool, it evaluates as false.

So the while loop will read one word at a time. If the read succeeds, then the body of the loop appends the word to the beginning of outstr. If it fails, the loop ends.

iss is a stream , and the >> is the extraction operator . If you look upon the stream as a continuous line of data, the extraction operator removes some data from this stream.

The while loop keep extracting words from the stream until it is empty (or as long as the stream is good one might say). The inside of the loop is used to add the newly extracted word to the end of the outstr

Look up information about c++ streams to learn more.

The instruction:

istringstream iss(instr);

allows instr to be parsed when the operator>> is used, separating words thourgh a whitespace character. Each time the operator >> is used it makes iss point to the next word of the phrase stored by instr .

iss >> outstr; // gets the very first word of the phrase

while (iss >> word) // loop to get the rest of the words, one by one
{
    outstr = word + ' ' + outstr; // and store the most recent word before the previous one, therefore reversing the string!
}
return outstr;

So the first word retrieved in the phrase is actually stored in the last position of the output string. And then all the subsequent words read from the original string will be put before the previous word read.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM