2016-10-01 47 views
-1

我正在尝试编写一个读取输入然后反转字符串的程序。 因此,我可能会输入“racecars”,它应该将其转换为“sracecar”。我不知道为什么我得到分段错误。我的调试器不清楚我的段错误是在哪里。我在vim中使用gdb调试器。分割错误,开头的不确定

如何在turnaround函数中使我的程序反向输入。

#include<iostream> 
#include<string> 
#include<algorithm> 
using namespace std; 

string turnaround(string &input); 

int main(){ 

    cout << "enter some string to reverso" << endl; 
    string input; 
    getline(cin,input); 

    turnaround(input); 
    //cout << "your input is " << input << endl; 

    return 0; 
} 

string turnaround (string & input){ 

    input = string(input.rbegin(), input.rend()); 
} 
+1

你的程序表现出不确定的行为,通过退出非void函数没有遇到一个'return'声明的方式。 –

+1

周转不返回任何东西!你是如何编译你的代码的? – HazemGomaa

+1

由于'turnaround()'正在修改'input',所以要么使其返回'void',要么在末尾添加一个'return input'语句。无论哪种方式,这将避免未定义的行为与功能的“结束”相关联。另外,打开编译器警告 - 大多数编译器,如果配置得当,会警告关于非'空洞'功能的结束。 – Peter

回答

1

一旦您离开了周转范围,您在转向中创建的新反转字符串将不再可用。所以你已经使输入指向不再存在的对象,这就是段错误的原因。

请尝试以下方法:

string turnaround(const string& input) 
{ 
    return string(input.rbegin(),input.rend()); 
} 
+0

这是不正确的,因为新字符串被复制分配给'input'。因此,它不会是一个悬而未决的参考。答案是,它是未定义的行为来省略return语句。 – drRobertz

+0

......并澄清:引用不能被重新设置,因此赋值不会使'input'引用另一个对象,它会为'input'引用的对象赋予一个新值。 – drRobertz