需要帮助调试我的代码,反转字符串中的单词

时间:2016-12-26 20:10:27

标签: c++ string

我需要一些帮助来调试我的代码。此代码旨在反转句子形式的字符串中的单词[假设字符串没有"。"在末尾]。出于某种原因,我作为输出获得的是缩进输出加上第一个单词之后的额外空格以及缩进输出减去第一个单词。我是编码的初学者;所以,如果可能的话,我会感谢更简单易懂的解决方案,或者使用循环,字符串和数组的解决方案。

示例输入:

My name is Edward

预期输出:

Edward is name My

收到的输出:

Edward  is name 

到目前为止,这是我的代码:

#include <iostream>
#include <string>
#include <stdio.h>

using namespace std;

int main() {

string s, n, a;
getline(cin, s);

for (int i = s.length(); i >= 0; i--){
    if (s[i] != 32 ) {
        n += s[i];
    }
    else {
        for (int j = n.length() -1; j >= 0; j--){
            a += n[j];
        }
        cout << a << ' ';
        n.clear();
        a.clear();
    }
}

cin.ignore();
getchar();
return 0;

}

另外,我刚注意到最后还有一个额外的空间。如果有办法可能取消输出最后一个空格;请告诉我。

感谢阅读,感谢您的帮助。

4 个答案:

答案 0 :(得分:5)

正如我在评论中所提到的,你是按字符反转整个字符串,但你需要拆分单词并反转:

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {

    string s, n;
    getline(cin, s);
    std::istringstream iss(s);
    std::vector<string> words;
    while(iss >> n) {
        words.push_back(n);
    }

    std::reverse(words.begin(),words.end());

    for(auto word : words) {
        std::cout << word << ' ';
    }

    getchar();
    return 0;    

}

Live Demo

答案 1 :(得分:2)

所以这只是从πάντα ῥεῖ's excellent answer抽象的另一步。您可以使用istream_iteratorostream_iterator来进一步简化代码。

回答问题的完整代码可归结为:

const vector<string> words{ istream_iterator<string>(cin), istream_iterator<string>() };

copy(crbegin(words), crend(words), ostream_iterator<string>(cout, " "));

Live Example

答案 2 :(得分:0)

编辑:感谢评论和解答的帮助,我用额外的空间修复了问题,并在最后添加了一些输出最后一个字的内容。它并不完美,但它确实有效。 :)

#include <iostream>
#include <string>

using namespace std;

int main() {

string s, n;
getline(cin, s);

for (int i = s.length() -1; i >= 0; i--){
if (s[i] != 32) {
    n += s[i];
}
else {
    for (int j = n.length() -1; j >= 0; j--){
        cout << n[j];
    }
    cout << ' ';
    n.clear();
}
}

for (int k = n.length() -1 ; k >= 0; k--)
cout << n[k];

cin.get();
return 0;

}

答案 3 :(得分:-1)

您可以使用strrev();功能代替所有for阻止。