在字符串c ++中反转单词

时间:2014-07-20 12:04:57

标签: c++ string algorithm

我刚开始学习C ++。我正在编写一个程序来反转字符串中单词的顺序。如果有一句话,"我爱纽约!"。它应该改为,"!约克新爱我"。

我使用的算法有两个简单的步骤。

  1. 反转字符串。
  2. 反转字母。
  3. 例如,对于上面的字符串,我将首先将其转换为"!kroY weN evol I"然后我会改变像#34;!kroY"去约克!"。

    现在的问题是,我怎么知道这个单词的起始位置和结束位置。这就是我到目前为止所做的。但是这个程序没有按预期工作。我无法识别这个词,然后将其反转。

    #include <iostream>
    #include <string>
    
    std::string reverseText(std::string x){
    std::string y;
    for(int i=x.size()-1;i>=0;i--) y += x[i];
    return y;
    }
    
    std::string reverseWords(std::string x){
    
    std::string y = reverseText(x);
    bool wordFound = true;
    std::string temp1,ans;
    
    for(size_t i=0;i<y.size();i++){
    
    
        if(wordFound){ 
    
            if(y[i]!=' ') temp1+=y[i];  // if there is a letter, store that in temp1.
    
            else if(y[i]==' ')   // if there is a space, that means word has ended.
            {
                ans += reverseText(temp1);  // store that word, in ans.
                temp1=" ";                  
                wordFound=false;}
            }
    
        if(y[i]==' ' && y[i+1]!=' ') wordFound=true;
        }
    return ans;
    }
    
    int main(){
    std::cout<<reverseWords("My name is Michael");
    }
    

    输出:Michaelis名称

1 个答案:

答案 0 :(得分:1)

我没有对此进行过广泛的测试,但仍然可能存在问题,但它为您提供的案例产生了正确的输出。我试图修改你的代码而不用太多改变它。

#include <iostream>
#include <string>

std::string reverseText(std::string x){
    std::string y;
    for(int i=x.size()-1;i>=0;i--) y += x[i];
    return y;
}

std::string reverseWords(std::string x) {
    std::string y = reverseText(x);
    bool wordFound = true;
    std::string temp1 = " ", ans;

    for(size_t i = 0; i < y.size(); i++) {
        if(wordFound){
            if(y[i] != ' '){
                temp1 += y[i];  // if there is a letter, store that in temp1.
            } else if(y[i]==' ') {  // if there is a space, that means word has ended.
                ans += reverseText(temp1);  // store that word, in ans.
                temp1 = " ";
                wordFound=false;
            }
        }
        if(y[i]==' ' && y[i+1]!=' ') wordFound=true;
    }
    ans += reverseText(temp1);
    return ans;
}

int main(){
    std::cout<<reverseWords("My name is Michael");
}

变更摘要

您忘记使用空格

初始化第一个字符串
std::string temp1 = " ", ans;

循环过后,你忘了将temp1的内容“刷新”回答

ans += reverseText(temp1);