分割错误

Segmentation fault error

本文关键字:错误 分割      更新时间:2023-10-16

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

Thanks in advance

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

我不知道第26行在哪里,但是

char * temp;
*temp = ...

无效。temp应该指向一个char,或者(更好)重写函数,其中temp 一个char

Seth Carnegie注意到,如果你想修改原件,你必须通过引用来通过string s。

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

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

你想要这个:

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

对于段故障原因,其他答案都是有效的。

我想你可能有兴趣知道你可以使用std::stringreverse_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");

…将返回oof .

按值传递字符串,这意味着只有字符串的本地副本将在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 = ...

您正在尝试为一些随机内存分配一个值,这可能会导致分割错误。

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

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--]);
 } 
}