为啥我在此代码中收到 SIGABRT 错误 [关闭]

Posted

技术标签:

【中文标题】为啥我在此代码中收到 SIGABRT 错误 [关闭]【英文标题】:Why am i getting a SIGABRT error in this code [closed]为什么我在此代码中收到 SIGABRT 错误 [关闭] 【发布时间】:2020-06-08 03:57:25 【问题描述】:

我在 CodeChef 中编写了这段代码,但它不断给我运行时错误,称为 (SIGABRT)。我一直在尝试解决这个问题,但没有结果。我已经最大限度地减少了记忆。我需要帮助。

有 N 个学生站成一排,从左到右从 1 到 N 编号。给定一个长度为 N 的字符串 S,其中对于每个有效 i,如果第 i 个学生是女孩,S 的第 i 个字符是“x”,如果这个学生是男孩,则为“y”。排成一排的学生是朋友。

要求学生组成双人组参加舞蹈比赛。每对必须由一个男孩和一个女孩组成。两个学生只有成为朋友才能结成一对。每个学生最多只能参加一对。最多可以组成多少对?

示例输入 3 xy xyxxy 是的

示例输出 1 2 0

解释 示例案例 1:只有一个可能的对:(第一个学生,第二个学生)。

示例案例2:形成两对的方法之一是:(第一个学生,第二个学生)和(第四个学生,第五个学生)。

另一种形成两对的方法是:(第二个学生,第三个学生)和(第四个学生,第五个学生)。

#include <iostream>
#include <string>
#define rp(l,p) for(int l = 0; l < p; l+=2)
#define s string 
#define ll long long
using namespace std;

int main() 
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    // your code goes here
    int t = 0;
    cin >> t;
    while(t--)
        s n = "";
        ll max = 0;
        cin >> n;
        if(n.size()%2 == 0)
            rp(l, n.size()-1)
                if(n.substr(0+l, 2) == "xy" || n.substr(0+l, 2) == "yx")
                    max+=1;
                
            
        
        else if(n.size()%2 == 1)
            s x = n.substr(n.size()-1, 1);
            n.resize(n.size()-1);
            for(int m = 0; m <= (n.size()-1); m+=2)
                if(n.substr(0+m, 2) == "xy" || n.substr(0+m, 2) == "yx")
                    max+=1;
                
            
            n.append(x);
            if(n.substr(n.size()-3,2) == "xy" || n.substr(n.size()-3,2) == "yx")

            
            else if(n.substr(n.size()-2,2) == "xy" || n.substr(n.size()-2,2)=="yx")
                max+=1;
            
        
        cout << max << endl;
    
    return 0;

【问题讨论】:

一些导致问题的示例输入会有所帮助 由于所有这些宏和非描述性的单字符变量,显示的代码很难理解。如果我要向其他人寻求帮助以找出我的代码存在的问题,我会尽量使其易于理解和具有描述性。我的代码越容易被别人理解,就越有可能有人看到问题。 我无法在不知道输入的情况下重现您的错误。这是link,您可以使用您的输入来触发sigabrt 并对其进行调试。只需单击“开始”即可构建您的代码,然后在终端中运行它。 我使用建议的输入运行了您的代码,并且成功了。你能提供一些不起作用的输入吗? 【参考方案1】:

我完全同意@Sam Varshavchik

但是,我尝试使用以下输入的代码:

    试试

    $ ./test

    输入 2

    输入哈

    输出 0

    输入lo

    输出 0 => 没有崩溃

    试试

    $ ./test

    输入 2

    输入哈

    输出 0

    输入lo

    输出 0

=> 没有崩溃

    试试

    $ ./test

    输入 2

    输入一个

    在抛出 'std::out_of_range' 的实例后调用终止 what(): basic_string::substr: __pos (即 2) > this->size() (即 0) 中止(核心转储)

所以让我们分析一下你的代码。当字符串 n 的大小为 1 时,它似乎会崩溃。

在您的 substr 调用中,如果字符串具有所需的长度(又名 substr(...,2)),则有很多没有任何验证的硬编码整数

【讨论】:

以上是关于为啥我在此代码中收到 SIGABRT 错误 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在编译时收到以下错误:[关闭]

为啥我会在这里获得 SIGABRT?

为啥我在此 SQL Server 内联表值函数上收到 11555 错误?

为啥我在 Firebase Cloud Functions 中收到“无效信封”错误? [关闭]

为啥我在课程课程中收到方法“TopStudents”的错误? [关闭]

为啥我在作曲家安装后在 Laravel 中收到 500 服务器错误 [关闭]