繁体   English   中英

在这个非常简单的程序中,什么会导致“信号 SIGABRT”错误?

[英]What can cause a 'signal SIGABRT' fault in this really simple program?

我一直在做练习作为函数和它们的一些界面。 目前,我只做了一个练习,即擦除一些更大的行中第一次出现的行“我们”。 有一个人有同样的问题和类似的情况( strcpy 导致 Thread 1: signal SIGABRT ),但我得到的错误不是在使用函数 strcpy 时,而是在我们返回 switch-case 构造时,尽管这是必须连接的。

#include <iostream>
using namespace std;

void task1_C() {
    const int N = 10;
    char S[N];
    char rem[3] = "we";
    cout << "Input your line (should consist of 10 characters): ";
    cin >> S;
    char *p = strstr(S, rem);
    if (p) {
        strcpy(p, p + strlen(rem));
        cout << S << endl;
    }
}

void task1_Cpp() {

}

void task2_C() {

}

void task2_Cpp() {

}

void task3_C() {

}

void task3_Cpp() {

}

void task4_Cpp() {

}

void task5_Cpp() {

}

int main(){
    int input;
    cout << "Input 1-5 for C++ functions, 11-13 for C functions." << endl;
    cin >> input;
    switch(input){
        case 1: task1_Cpp(); break;
        case 2: task2_Cpp(); break;
        case 3: task3_Cpp(); break;
        case 4: task4_Cpp(); break;
        case 5: task5_Cpp(); break;
        case 11: task1_C(); break;
        case 12: task2_C(); break;
        case 13: task3_C(); break;
    }
    return 0;
}

输出:

Input 1-5 for C++ functions, 11-13 for C functions.
11
Input your line (should consist of 10 characters): sweweratwe
sweratwe
Program ended with exit code: 9

您的程序具有未定义的行为,显示的输入已经在该行

cin >> S;

数组S长度为10 ,输入由 10 个字符组成,但是>>char*重载需要一个额外的字符来存储字符串的空终止符。 这意味着数组的大小必须至少为11 事实并非如此,您的程序越界访问数组并导致未定义的行为,这意味着程序可能会或可能不会崩溃或执行任何操作。

您不应该使用char数组在 C++ 中存储字符串。 您应该改用std::string 在 C 中,你不应该使用cin >> (因为它没有),你应该只学习/教授 C 或 C++,而不是两者混合。 你不会在 C++ 中使用strcpystrstr 两种语言中被认为好的风格是完全不同的。

>>char*重载甚至将从 C++20 中的语言中删除。 相反,将有一个按引用引用char[N]数组的重载,然后它将在N-1字符后停止读取以避免缓冲区溢出像这样。 在你这里直接使用S的情况下,它是一个数组,你的程序将跳过读取最后一个字符,因为它会超出数组的边界,在 C++20 中,但至少这个未定义行为的直接来源将不再出现。

此外,如果源和目标重叠, strcpy具有未定义的行为。 而是在 C++ 中使用std::copy或在 C 中使用memmove

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM