c++ “从abort(3)发出Abort信号(SIGABRT)”,为什么只针对某些情况?

vdgimpew  于 2023-01-10  发布在  其他
关注(0)|答案(7)|浏览(213)

我正在尝试从数组元素中构造最大数。下面给出的我的实现在某些情况下工作正常,而在其他一些情况下它给出错误“Abort(3)(SIGABRT)的Abort信号”。为什么?帮帮我!

#include <iostream>
#include<bits/stdc++.h>
using namespace std;

int main() {
int t;
cin>>t;
while((t--)>0){
    int n;
    cin>>n;
    int a[n];
    string s="";
    for(int i=0;i<n;i++){
        cin>>a[i];
        if(i==0){s+=to_string(a[i]); continue;}
        string s1 = s+to_string(a[i]); //sX
        string s2 = to_string(a[i])+s; //Xs

        if(stoi(s1)>=stoi(s2))s=s1;
        else s = s2;
    }
    cout<<s<<endl;
    }

return 0;
 }

对于以下情况,我的代码将给出错误

4                  //size of array
54 546 548 60      //elements of array
ej83mcc0

ej83mcc01#

这是由于stoi函数的缘故,它不能处理非常大的数字。
对于stringint的转换,请尝试以下方法。
手动将string转换为int的算法:

int x = 0; // may take long long 
for(int i = 0; i < s.length(); i++)
    x = x * 10 + s[i] - '0';

变量x将存储所讨论字符串的整数值。

2eafrhcq

2eafrhcq2#

这个错误发生时你是循环无限的时间或弹出操作没有完成,我得到了同样的错误以前,但可以设法解决后

9lowa7mx

9lowa7mx3#

此错误通常在您访问不可用的内容时出现,如内存等。请看示例,我将col声明为m,但将n的大小声明为它,(因此,当我的程序尝试访问m以外的位置时,它会抛出此错误)

vector<vector<int>>dist(n,vector<int>(n,INF));---> instead of this 
vector<vector<int>>dist(n,vector<int>(m,INF));

这些都是小错误,但可能会花费大量时间

class Solution {
  public:
    int shortestPath(vector<vector<int>> &grid, pair<int, int> source,
                     pair<int, int> destination) {
        // code here
        int n=grid.size();
if(source.first==destination.first && source.second==destination.second) return 0;
        int m=grid[0].size();
        const int INF=1e9+7;
        vector<vector<int>>dist(n,vector<int>(n,INF));
        queue<pair<int,pair<int,int>>>q;
        dist[source.first][source.second]=0;
        q.push({0,{source.first,source.second}});
        int row[]={-1,0,1,0};
        int col[]={0,1,0,-1};
        while(!q.empty()){
            auto d=q.front().first;
            auto r=q.front().second.first;
            auto c=q.front().second.second;
            q.pop();
            for(int i=0;i<4;i++){
                int newr=row[i]+r;
                int newc=col[i]+c;
                
                if(newr>=0 && newc>=0 && newr<n && newc<m && grid[newr][newc]==1 && 
                1+d<dist[newr][newc]){
                    dist[newr][newc]=1+d;
                    if(newr==destination.first && newc==destination.second){
                        return 1+d;
                    }
                    q.push({1+d,{newr,newc}});
                    
                }
            }
        }
        return -1;
        
        
        
    }
    
};

以上代码是二元迷宫(0,1)问题。(图形主题

rfbsl7qr

rfbsl7qr4#

这是由于INT_MAX和INT_MIN值(即2^31-1和-2^31)不能存储在整数类型数据中;同样,int z=stoi(string x)将string转换并返回为int

6ie5vjzr

6ie5vjzr5#

根据您的程序,要通过将数组的第一个元素和最后一个元素相加(字符串方式)来获得最大数,请尝试以下操作:

s = to_string(a[0]); #to get the first element

s1 = s1 + to_string(a[i]); #to get the ith element
     
s2 = to_string(a[i]) + s2;

以便使用数组的所有元素,而不是仅使用第一个和最后一个元素。

c9qzyr3d

c9qzyr3d6#

不使用'stoi'函数,而是使用以下代码将字符串转换为整数:

int num = 0;  
    for(int i = 0; i < s.length(); i++){
        num = num * 10 + s[i] - '0';
    }
sbtkgmzw

sbtkgmzw7#

如果程序本身检测到错误,则使用call to abort()生成此信号。标准库也使用此信号报告内部错误。c++中的assert()函数也使用abort()生成此信号。

相关问题