`我正在尝试编写一个反转两个字符串的程序,虽然我做得很好但是当我运行它时,程序运行到第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;
}
答案 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--]);
}
}
我没有彻底测试过它。