为什么我的C++代码中出现'Segmentation Fault: 11'行?



我是 c++ 编码的新手,对于家庭作业,我不断收到分割错误:11,我不知道为什么。我事先做了一些研究,我尝试更改所有变量名称,没有区别。我应该怎么做才能解决这个问题?下面是我的代码。

#include <iostream>
using namespace std;
string middle(string str);
string middle(string str){
if(str.length() % 2 == 1){
cout << str[str.length()/2] << endl;
return 0;
}
else if(str.length() % 2 == 0){
cout << str[(str.length() + 1)/2];
cout << str[((str.length() + 1)/2) - 1];
return 0;
}
return 0;
}
int main(){
string a_word;
cout << "Enter a word: ";
cin >> a_word;
middle(a_word);
}
#include <iostream>
using namespace std;

void middle(string str){
if(str.length() % 2 == 1){
cout << str[str.length()/2] << endl;
return ;
}
else if(str.length() % 2 == 0){
cout << str[(str.length() + 1)/2];
cout << str[((str.length() + 1)/2) - 1];
return ;
}
return ;
}
int main(){
string a_word;
cout << "Enter a word: ";
cin >> a_word;
middle(a_word);
}

将您的代码更改为此它将起作用。 我已将函数的返回类型更改为 void 而不是字符串。 发生分段错误是因为您返回的是整数,而返回函数的类型是字符串。

string middle(string str)

定义一个将返回std::string的函数,但你这样做

return 0;

正如凯文正确发现的那样,这实际上是编译的。std::string有一个构造函数,该构造函数仅将const char*作为参数,因此它有资格作为隐式转换构造函数,并且文本0可以解析为空指针文本(不适用于其他数字(。因此,适当的构造函数(数字 5(被调用并期望一个有效的指针。参考资料指出:

如果 [s, s + Traits::length(s(( 不是有效范围(例如,如果 s 是空指针(,则行为未定义。

正是如此,传递给构造函数的参数是0的,所以你会得到未定义的行为。在你的情况下是赛格错误,在我的情况下是一个例外。


要解决此问题,只需删除所有return并将返回类型更改为void,因为您既不使用返回值,也不返回任何有意义的值。

请注意,对于空字符串,这仍然会失败,您应该为这种情况添加检查。

void middle(string str) {
if(str.empty()) {
return;
}
if (str.length() % 2 == 1) {
cout << str[str.length()/2] << endl;
}
else if (str.length() % 2 == 0) {
cout << str[(str.length() + 1)/2];
cout << str[((str.length() + 1)/2) - 1];
}
}

最新更新