在句子中反转单词顺序

时间:2017-02-08 05:53:14

标签: c++ recursion

我在创建一个扭转句子顺序的函数时遇到了困难。我已经阅读了许多关于如何递归地反转周围字母的函数,并且我已经成功地完成了,但我不想反转字母中的字母。我想颠倒句子中单词的位置。

示例是:

这是一句话。

句子。这是

到目前为止,这是我的代码。如何从整个句子的字母顺序转换为句子中单词的放置顺序?

当前代码的输出将提供:!dlroW olleH

void reverse(const std::string str)
{
    int length = str.size();
    if(length > 0)
    {
        reverse(str.substr(0,length-1));
        std::cout << str[0];

    }
}

编辑:其他问题。如果这是一个char数组,逻辑会不同吗?

5 个答案:

答案 0 :(得分:5)

使用std::istringstream和帮助函数简化您的逻辑。下面的程序适合我。

#include <sstream>
#include <iostream>

void reverse(std::istringstream& stream)
{
   std::string word;
   if ( stream >> word )
   {
      reverse(stream);
      std::cout << word << " ";
   }
}

void reverse(const std::string str)
{
   std::istringstream stream(str);
   reverse(stream);
   std::cout << std::endl;
}

int main(int argc, char** argv)
{
   reverse(argv[1]);
   return 0;
}

答案 1 :(得分:1)

std::vector<std::string> splitString(const std::string &s, char delim) {
    std::stringstream ss(s);
    std::string item;
    std::vector<std::string> tokens;
    while (getline(ss, item, delim)) {
        tokens.push_back(item);
    }
    return tokens;
}
void reverseString(const std::string& string) {

    std::vector<std::string> words = splitString(string, ' ');
    auto end = words.rend();
    for (auto it = words.rbegin(); it <= end; it++) {
        std::cout << *it << std::endl;
    }
}
reverseString("This is a sentence.");

答案 2 :(得分:1)

// Pass string which comes after space
// reverse("This is a sentence.") 
// reverse("is a sentence.") 
// reverse("a sentence.") 
// reverse("sentence.") 
// will not find space 
// start print only word in that function

void reverse(const std::string str)
{
    int pos = str.find_first_of(" ");
    if (pos == string::npos) // exit condition
    {
        string str1 = str.substr(0, pos);
        cout << str1.c_str() << " " ;
        return;
    }

    reverse(str.substr(pos+1));
    cout << str.substr(0, pos).c_str() << " ";
}

简单易懂:

void reverse(const std::string str)
{
    int pos = str.find_first_of(" ");
    if (pos != string::npos) // exit condition
    {
        reverse(str.substr(pos + 1));
    }
    cout << str.substr(0, pos).c_str() << " ";
}

答案 3 :(得分:1)

您可以拆分输入并按相反顺序打印它们 或者如果你想使用递归结构,只需在调用这样的函数后移动cout:

void reverse(const std::string str)
{
    std::stringstream ss(str);
    std::string firstWord, rest;
    if(ss >> firstWord)
    {
        getline(ss , rest);
        reverse(rest);
        std::cout << firstWord << " ";
    }
}

答案 4 :(得分:0)

我不是C ++程序员,但我会创建另一个数组(tempWord [])来存储单个单词。

  1. 扫描每个单词并将它们存储到tempWord数组中。在您的情况下,单词由空格分隔,所以:

    a。下一个空格的索引,

    b子串到下一个空格的索引和

    ℃。你应该得到{“This”,“is”,“a”,“sentence。”}

  2. 反向再次添加:

    一个。循环索引i从“tempWord.length -1”到“0”

    湾new String = tempWord [i] +“”;

  3. 打印出结果。