为什么我在此代码中收到 SIGABRT 错误

Why am i getting a SIGABRT error in this code

本文关键字:SIGABRT 错误 代码 为什么      更新时间:2023-10-16

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

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

要求学生组成双人舞比赛。每对必须由一个男孩和一个女孩组成。两个学生只有在是朋友的情况下才能组成一对。每个学生最多只能是一对的一部分。可以形成的最大对数是多少?

示例输入 3 XY xyxxy YY

示例输出 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;
}

我完全与@Sam瓦尔沙夫奇克在一起

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

  1. 尝试

    $ ./测试

    输入 2

    输入 HA

    输出 0

    输入LO

    输出 0 => 无崩溃

  2. 尝试

    $ ./测试

    输入 2

    输入 HA

    输出 0

    输入LO

    输出 0

=> 无崩溃

  1. try

    $ ./测试

    输入 2

    输入 A

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

因此,让我们分析一下您的代码。当字符串 n 的大小为 1 时,它似乎崩溃了。

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