-2

请告诉我为什么我的反转输入字符串的代码给了我各种错误。

#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
void ReverseString(string &aString);
int main(){
    string info;
    cout << "What's your string?" << endl;
    getline(cin, info);
    ReverseString(info);
    cout << ReverseString(string info) << " compare with: " << info << endl;
    system("pause");
    return 0;
}

void ReverseString(string &aString){

for(int i = 0; i < aString.length(); i++)
    {
        string temp = 0; // initialize temporary string
        temp = temp + aString.at(aString.length() - 1 - i); // hold temporary string
        if(i => aString.length()) /*assign temp string to aString when all chars are processed*/
        {
            temp = &aString;
        }

    }

}
4

4 回答 4

3

您好,您可以通过使用 STL 大大简化您的代码

例如:

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    std::string str = "Hello World";
    cout << str << endl; 
    std::reverse(str.begin() , str.end());
    cout << str << endl;
   return 0;
}

让我知道这是否不适合您的需求,因为还有其他一些方法可以做到这一点。

没有 STL:

需要对您的代码进行一些更正/更改,我在下面提供了这些。但是,您可能需要查看一些有关引用变量的文档,以了解它是如何工作的,例如:

http://www.cprogramming.com/tutorial/references.html

http://www.thegeekstuff.com/2013/05/cpp-reference-variable/

http://en.wikipedia.org/wiki/Reference_(C++)

什么是 C++ 中的引用变量?

http://www.tutorialspoint.com/cplusplus/cpp_references.htm

正确的引用和指针使用是 C++ 的主要部分,如果使用正确,可以实现该语言中一些最强大的功能,或者如果使用不当,会造成严重的头痛和精神创伤,因此值得,甚至是必不可少的牢牢把握住他们。

即便如此,预计奇怪的误用也会时常出现。:)

#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
void ReverseString(string &aString);
int main(){
    string info;
    cout << "What's your string?" << endl;
    getline(cin, info);
    cout << info << " compare with: ";
    ReverseString(info);
    cout << info << endl;
    system("pause");
    return 0;
}

void ReverseString(string &aString)
{

    int len = aString.length();
    string temp = aString;// initialize temporary string
    aString ="";
    for(int i = 0; i < len; i++)
    {
        aString += temp[len - (1+ i)]; // assigns the reversed value to the referenced string
    }
}

刚刚注意到@zac-howland 的以下引用:确实如此,但是我将代码保留为说明性的部分。如果对此进行了一些阅读以及大量的实验,我希望 NewProgrammer 将获得他需要的信息和技能组合以继续前进。

于 2013-11-12T15:48:13.680 回答
1
#include<iostream>
#include<string>
#include <algorithm>
using namespace std;

string info;
string rvrs(string &str)
{
    std::reverse(str.begin(),str.end());
    return str;
}
int main()
{
    cout<<"What is your string :: ";
    getline(cin,info);
    cout<<rvrs(info);
    cout<<endl; 
return 0;
}
于 2014-12-14T16:00:36.387 回答
0

你有很多问题。

    string temp = 0; // initialize temporary string

将字符串初始化为0. 在这里就好string temp;了。

    temp = temp + aString.at(aString.length() - 1 - i); // hold temporary string

这不是我做事的方式,但我想它应该有效。

    if(i => aString.length()) 

这个条件似乎没有意义。您的循环被定义为i从 0 到字符串的长度 -1 进行迭代,因此它永远不会大于或等于字符串长度。

    /*assign temp string to aString when all chars are processed*/
    {
        temp = &aString;
    }

这里的代码与注释不匹配。评论说你要分配给aString,但代码分配了一些东西给temp。该评论可能更接近您真正想要的。但是您仍然需要修复条件,并且可能希望在循环完成执行后执行此操作。所以在伪代码中,你最终会得到类似的东西:

for (all characters in the string)
    add the next character in the string to the end of temp
assign temp back to the original string
于 2013-11-12T15:42:57.937 回答
0

除了逻辑错误之外,您还有一些语法错误:

cout << ReverseString(string info) << " compare with: " << info << endl;

ReverseString(string info)会将一个空字符串传递给您的ReverseString函数(如果它甚至可以编译 - 看起来它不应该因为您info在同一范围内有 2 )。你想要的是:

cout << ReverseString(info) << " compare with: " << info << endl;

在您的反向功能中,您只需要转到length() / 2.

由于您是通过引用传递的,因此您对函数中的字符串所做的更改将反映在您传递给它的对象中。也就是说,原件info将被反转。如果你想让它对一个副本进行操作,你需要通过副本而不是通过引用来传递它。

最后,cout << ReverseString(info)没有用(如果它甚至可以编译)ReverseString返回 a void。你应该让它返回一个string(反转的字符串)。

于 2013-11-12T15:47:02.953 回答