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

C++ 需要帮助调试我的代码,以反转字符串中的单词吗,c++,string,C++,String,我需要一些调试代码的帮助。此代码旨在反转以句子形式出现的字符串中的单词[假设字符串末尾没有“.”。出于某种原因,我得到的输出是缩进输出加上第一个单词后的额外空格,以及缩进输出减去第一个单词。我是一个编码初学者;因此,如果可能的话,我希望有更简单易懂的解决方案,或者使用循环、字符串和数组的解决方案 样本输入: My name is Edward 预期产出: Edward is name My 收到的输出: Edward is name 以下是我目前的代码: #include <io

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

样本输入:

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;

}
#包括
#包括
#包括
使用名称空间std;
int main(){
字符串s,n,a;
getline(cin,s),;
对于(int i=s.length();i>=0;i--){
如果(s[i]!=32){
n+=s[i];
}
否则{
对于(int j=n.length()-1;j>=0;j--){
a+=n[j];
}

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

#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;    

}
#包括
#包括
#包括
#包括

#包括

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

#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;    

}
#包括
#包括
#包括
#包括

#包含您可以使用
strev();
函数代替
块的所有

您可以使用
strev()
函数,而不是
块的所有

编辑:感谢评论和答案的帮助,我修复了额外空间的问题,并在结尾添加了输出最终单词的内容。这并不完美,但很有效。:)

#包括
#包括
使用名称空间std;
int main(){
字符串s,n;
getline(cin,s),;
对于(int i=s.length()-1;i>=0;i--){
如果(s[i]!=32){
n+=s[i];
}
否则{
对于(int j=n.length()-1;j>=0;j--){

cout编辑:感谢来自评论和答案的帮助,我用额外的空间修复了问题,并在结尾添加了输出最终单词的内容。这并不完美,但很有效。:)

#包括
#包括
使用名称空间std;
int main(){
字符串s,n;
getline(cin,s),;
对于(int i=s.length()-1;i>=0;i--){
如果(s[i]!=32){
n+=s[i];
}
否则{
对于(int j=n.length()-1;j>=0;j--){

cout因此,这实际上只是从中抽象的一个附加步骤。您可以使用和进一步简化代码

回答您问题的全部代码可以归结为:

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

copy(crbegin(words), crend(words), ostream_iterator<string>(cout, " "));
const向量词{istream_迭代器(cin),istream_迭代器();
复制(crbegin(单词)、CRND(单词)、ostream_迭代器(cout)(“”);

因此,这实际上只是从中提取的附加步骤。您可以使用和进一步简化代码

回答您问题的全部代码可以归结为:

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

copy(crbegin(words), crend(words), ostream_iterator<string>(cout, " "));
const向量词{istream_迭代器(cin),istream_迭代器();
复制(crbegin(单词)、CRND(单词)、ostream_迭代器(cout)(“”);

您想反转单词(
std::string
变量)而不是字符!
s[s.length()]
超出了外部循环开始的范围。这是未定义的行为,但在我的测试中,它会使
n
的第一个字符为null,然后被复制,等等。调试器会对您有很大帮助,允许您单步执行每一行,并查看操作如何影响您的变量。如果您修复在外循环中的越界错误,你的代码大部分都是有效的。问题是你的代码>Out/<代码>反转这个单词并打印出来,除非最后用一个空格结束,否则它不会被打入最后一个单词。考虑把内环分解成它自己的函数,你可以在循环外调用<代码> n>代码>来处理最后一个单词。韵文(
std::string
variables)不是字符!
s[s.length()]
超出了外部循环开始的范围。这是未定义的行为,但在我的测试中,它会使
n
的第一个字符为null,然后被复制,等等。调试器会对您有很大帮助,允许您单步执行每一行,并查看操作如何影响您的变量。如果您修复在外循环中的越界错误,你的代码大部分都是有效的。问题是你的代码>Out/<代码>反转这个单词并打印出来,除非最后用一个空格结束,否则它不会被打入最后一个单词。考虑把内环分解成它自己的函数,你可以在循环外调用<代码> N<代码>来处理最后一个词。布特今天缺少选票ῥεῖ'“让我脸红,谢谢你。”这是一个很好的回答ῥεῖ LOL,我喜欢看到好的C++答案。我喜欢投票给他们,并在任何可能的地方引用它们……我只希望我能看到更多像你们和我的答案一样的代码:我很抱歉今天缺少选票。ῥεῖ'“让我脸红,谢谢你。”这是一个很好的回答ῥεῖ 哈哈,我喜欢看到好的C++答案。我喜欢投票给他们,并在任何可能的地方引用它们……我只是希望看到更多像你和我的答案:J。