我是 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];
}
}