【问题标题】:Abort signal from abort(3) (SIGABRT) in C++C++ 中来自 abort(3) (SIGABRT) 的中止信号
【发布时间】:2020-06-27 12:21:54
【问题描述】:
#include <iostream>
using namespace std;

int main()
{
    //code
    int test;
    cin >> test;
    while(test--)
    {
        int count = 0;
        string input;
        cin >> input;
        for (int j = 0; j < input.length() - 2; j++)
        {
           if (input.substr(j, 3) == "gfg")
           {
                count +=1;
           }
        }
        if (count > 0)
        {
            cout << count << endl;
        }
        else
        {
            cout << -1 << endl;
        }
        
    }
    return 0;
}

此代码显示来自 abort(3) (SIGABRT) 的 Abort 信号,同时在 Geeks for Geeks 中提交,同时在本地计算机上完美运行,甚至在各种在线编译器上完美运行。无法弄清楚问题所在。有人可以帮忙吗?

【问题讨论】:

  • 离题但if(count&gt;0)if(count)是一样的。
  • @VinaySomawat 我不敢苟同。如果count 增加了足够多的次数以致其容量溢出怎么办?作为有符号整数,它将变成负数。所以,不,它是不一样的,因为它不太可能发生。
  • @SirDarius 是的,你是对的!
  • @SirDarius 至少在 c++17 之前,int 溢出保证会变成负数。它只是UB,所以检查等价的。
  • @cigien 够公平!值得一提的是,整数溢出是一个非常重要的错误来源,不容忽视。

标签: c++ c++11 c++14 c++17


【解决方案1】:

想想当input 少于两个字符时会发生什么。

input.length() 是一个无符号数,所以input.length() - 2 会环绕成一个天文数字。

j 是一个天文数字时,input.substr(j, 3) 不好:it throws the exception std::out_of_range;由于您没有捕获此异常,因此您的程序终止。

这些竞赛测试您是否涵盖所有可能的输入域,尤其是边缘情况。请务必在编写算法时考虑它们。

【讨论】:

  • 是的,角盒。 :P
  • 非常感谢!我仔细考虑了过去 2 天,现在看到了我所缺少的 - input.length() 是一个未签名的数量
【解决方案2】:

我认为 .substr 需要字符串库。 出于某种原因,您在本地不需要它。

尝试添加

#include <string>

编辑:我尝试了一些变化

if(input.length()<2)
{
cout<<-1<<"\n" ;
break;
}

for 循环之前应该有帮助(当你减去它的值时,input.length() 不会溢出。

【讨论】:

  • 这是真的,应该包括&lt;string&gt;。但是,这并不能解决问题,因为 OP 存在运行时错误,而不是编译时错误。
  • 为什么是break?为什么不cout &lt;&lt; -1 &lt;&lt; '\n'?这似乎是“不匹配”情况所需的输出,除非 [unseen] 规范另有说明。
  • 现在您缺少换行符。慢慢来!
  • 如何解释为什么if 检查也有帮助?这比仅仅提供修复更有用。
猜你喜欢
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
相关资源
最近更新 更多