分割错误
Segmentation fault error
'我试图写一个程序,反转两个字符串,我虽然我做得很好,但当我运行它,程序运行到第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::string
的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");
…将返回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--]);
}
}
相关文章:
- C++映射分割错误(核心转储)
- 由cin中的字符串中未捕获空白引起的分割错误
- 删除映射和分割错误中的一个过去结束元素
- 在指向函数中读取变量时出现分割错误
- 在链表中的第 n 位插入显示分割错误
- 较高值 n 的分割错误(例如 n=999997)
- 尝试通过memcpy复制大尺寸浮点向量时的分割错误
- 分割错误:向量中的擦除功能
- 向量向量的分割错误
- 我在C++中编写了一个方法来打印树类的预序,但它显示了分割错误
- C ++分割错误,为什么使用"long long"我没有得到答案?
- 在尝试使用递归查找集合子集的总数时,我遇到了分割错误
- 分割错误 11:尝试使用 cin 输入 B[1] 时
- 集合布局上的 Qt 分割错误
- 高达20亿的筛子会产生分割错误
- G :内部编译器错误:分割故障(程序CC1PLUS) - 我在哪里开始
- 二进制搜索树操作程序错误:分割故障(核心倾倒)
- 在给出正确的输出后,给出错误分割错误(核心转储)
- 得到错误分割错误(核心转储)进程返回139 (0x8B)
- 内部编译错误:分割错误在gcc.发送可变模板到struct时