反向字符串脚本给出运行时错误

时间:2013-11-12 18:52:57

标签: c++ string reference compiler-errors

我尽力修复逻辑,但无法检测到错误。我不能使用[]或任何其他高级功能,因为我还没有涵盖它们。如果可以的话,请告诉我我的错误。请不要给我负面因素,因为我已经尽力了,我的错误没有意义!感谢。

此脚本应该反转输入字符串:例如:hi to ih。

#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: " << endl;
    ReverseString(info);
    cout << info << endl;
    system("pause");
    return 0;
}

void ReverseString(string &aString)
{

    for(int i = 0; i < aString.length(); i++)
    {

        int u = aString.length() - 1 - i;
        string temp = "";
        temp += aString.at(aString.length() - 1 - i); 
        if(u == 0 )/* when aString.length() - 1 - i == 0, the last char will have been processed*/
        {
        aString = temp; /*store temp into aString; when its value changes, it is passed     into info's value*/
        }


    }

}

3 个答案:

答案 0 :(得分:2)

您的问题是,每次在ReverseString()中执行for循环时,您都会重新初始化temp变量,删除已保存在字符串中的所有内容。如果我对ReverseString函数执行此操作,您的程序将按预期工作:

void ReverseString(string &aString)
    string temp = "";

    for(int i = 0; i < aString.length(); i++)
    {

        int u = aString.length() - 1 - i;
        temp += aString.at(aString.length() - 1 - i); 
        if(u == 0 )/* when aString.length() - 1 - i == 0, the last char will have been processed*/
        {
        aString = temp; /*store temp into aString; when its value changes, it is passed     into info's value*/
        }

答案 1 :(得分:1)

你应该保持简单,你想要的是查看旧字符串的最后一个字符并将其放在新字符串的末尾。因此,不是从0循环到结束,而是从end循环到0.但是你应该在循环之前声明你的新字符串,因为如果你在循环中执行它,你将总是在每次迭代后抛出内容。

string newString;
for(int i = aString.length() - 1; i > 0; i--) {
    newString.append(aString.at(i));
}

答案 2 :(得分:1)

古典成语涉及交换和维持两个 指数:

void
ReverseString( std::string& target )
{
    int bottom = 0;
    int top = target.size();
    while ( top > bottom ) {
        -- top;
        char tmp = target[top];
        target[top] = target[bottom];
        target[bottom] = tmp;
        ++ bottom;
    }
}

(实际上,我在循环中使用std::swap,但我想 这也是被禁止的。)

这可以完成这项工作,并避免额外的中间人 字符串。