为什么我会得到一个';分段错误:11';我的C++;密码? 我对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); } #包括 使用名称空间std; 弦中(弦str); 字符串中间(字符串str){ 如果(str.length()%2==1){ 不能包含 使用名称空间std; 中间空白(字符串str){ 如果(str.length()%2==1){ 库特

为什么我会得到一个';分段错误:11';我的C++;密码? 我对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); } #包括 使用名称空间std; 弦中(弦str); 字符串中间(字符串str){ 如果(str.length()%2==1){ 不能包含 使用名称空间std; 中间空白(字符串str){ 如果(str.length()%2==1){ 库特,c++,segmentation-fault,C++,Segmentation Fault,定义一个函数,该函数将返回一个std::string,但您可以 return 0; 正如Kevin正确地发现的那样,这实际上是编译的。std::string有一个构造函数,它只接受一个const char*作为参数,因此它符合隐式转换构造函数的条件,并且文本0可以解析为空指针文本(不适用于其他数字)。因此,适当的构造函数()调用了get,需要一个有效指针。引用声明: 如果[s,s+Traits::length(s))不是有效范围(例如,如果s是空指针),则该行为未定义 正是这种情况,传递给构造

定义一个函数,该函数将返回一个
std::string
,但您可以

return 0;
正如Kevin正确地发现的那样,这实际上是编译的。
std::string
有一个构造函数,它只接受一个
const char*
作为参数,因此它符合隐式转换构造函数的条件,并且文本
0
可以解析为空指针文本(不适用于其他数字)。因此,适当的构造函数()调用了get,需要一个有效指针。引用声明:

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

正是这种情况,传递给构造函数的参数是
0
,因此您会得到未定义的行为。在您的情况下是seg错误,在我的情况下是异常


要解决这个问题,只需删除所有
返回值
,并将返回类型更改为
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];
    }
}
void中间(字符串str){
if(str.empty()){
返回;
}
如果(str.length()%2==1){

难道你不应该检查字符串长度为零,并写出它应该做的事情,找到一个单词的中间字母吗?它似乎是你的中间()函数应该返回一个字符串而不是整数。这可能是您的问题的一部分。@churill不幸的是,这将被编译…它使用构造函数#5来获取
常量char*
。我对这个问题投了赞成票,因为我认为对于新手来说,这根本不清楚为什么是未定义的行为。如果这是实际的代码ll可以删除返回,因为在if(){}else{}之后没有执行其他语句,因为
0
被转换为
nullptr
std::string()而崩溃
使用接受
const char*
的构造函数。取消引用
nullptr
时,将具有未定义的行为。
return 0;
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];
    }
}