分段错误错误

时间:2011-11-17 02:07:00

标签: c++ segmentation-fault

`我正在尝试编写一个反转两个字符串的程序,虽然我做得很好但是当我运行它时,程序运行到第26行,然后我得到一个分段错误错误。该程序编译良好。我想知道我的功能中是否有一个简单或明显的问题,我没有看到,任何帮助都将不胜感激!!

提前致谢

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

// Reversing the characters in strings.

void reverse(string str);
void swap(char * first, char *last);

int main() {
    // declarations and initialization
    string str1;
    string str2;

    cout << "Please enter the first string of characters:\n";
    cin >> str1;

    cout << "Please enter the second string of characters:\n";
    cin >> str2;

    cout << "The strings before reversing are:" << endl;
    cout << str1 << " " << str2 << endl;

    // reverse str1
    reverse(str1);
    // reverse str2
    reverse(str2);

    // output
    cout << "The strings after reversing: " << endl;
    cout << str1 << " " << str2 << endl;

    return 0;
}

void reverse(string str) {
    int length = str.size();

    char *first = NULL;
    char *last = NULL;
    first = &str[0];
    last = &str[length - 1];
    for (int i = 0; first < last; i++) {
        swap(first, last);
        first++;
        last--;
    }
}

void swap(char *first, char *last) {
    char * temp;

    *temp = *first;
    *first = *last;
    *last = *temp;
}

5 个答案:

答案 0 :(得分:6)

我不知道26号线在哪里,但是

char * temp;
*temp = ...

无效。 temp应指向char,或者(更好)将函数重写为temp char的位置。

Seth Carnegie观察到,如果你想修改原件,你必须通过引用传递string

void reverse(string& str) { //pass by reference, so origional is modified

答案 1 :(得分:3)

swap函数中,当*temp未指向任何内容(未初始化)时,您正在为temp分配值。因此,您的分段错误。

你想要这个:

void swap(char* first, char* last)
{
    char temp = *first;
    *first = *last;
    *last = temp;
}

答案 2 :(得分:2)

您按值传递字符串,这意味着只有字符串的本地副本才会在reverse函数中反转。你应该通过引用传递它们。

另外,请勿直接更改字符串的内存。像这样使用operator[]

for (size_t beg = 0, size_t end = str.size() - 1; beg < end; ++beg, --end)
    str[beg] = str[end];

所有在一起:

void reverse(string& str); // prototype

....

void reverse(string& str) { // note the & which is pass by reference
    int length = str.size();

    for (size_t beg = 0, size_t end = str.size() - 1; beg < end; ++beg, --end)
        str[beg] = str[end];
}

正如Mooing Duck所说,你可能正在崩溃的地方是取消引用一个垃圾值指针:

char * temp;
*temp = ...

你试图为一些随机存储器分配一个值,这可能会让你感到沮丧。

答案 3 :(得分:2)

其他答案对于段错误原因有效。

我认为您可能有兴趣知道可以使用std::string的{​​{1}}轻松转换字符串:

reverse_iterator

所以,请致电:

std::string reverse(std::string str) {
    std::string out;
    for (std::string::reverse_iterator it = str.rbegin(); it != str.rend(); it++) {
        out += *it;
    }
    return out;
}

...将返回reverse("foo");

答案 4 :(得分:0)

同样,其他人已经指出了问题所在,并希望向您展示:

void reverse(std::string & str) {     
 for (int i = 0, last = str.size() - 1, lim = str.size() / 2 ; i < lim;) {
  std::swap(str[i++], str[last--]);
 } 
}  

我没有彻底测试过它。