2017-12-15 11 views
-3

このコードは自分のPC上で正常に動作しますが、オンラインジャッジ(Spoj)上でSIGABRTを表示しています。私はこの問題は、私が使用したときのgetlineでそれが受け入れられてしまっていると思う:getline(cin、s)によるSIGABRTエラー

input format: 52 + 81 = machula or 5machula + 81 = 133 

string s1,s2,s3; 
cin>>s1; 
cin.ignore(3); 
cin>>s2; 
cin.ignore(3); 
cin>>s3; 

しかし、私は私がgetlineのに使用する必要があり、以前のSUBSTRを使用したい

string s,s1,s2,s3; 
//cin.ignore(INT_MAX,'\n'); 
getline(cin,s); 
int p1=0,p2,p3,l1,l2,l3; 
l1=s.find("+")-1; 
p2=s.find("+")+2; 
l2=s.find("=")-s.find("+")-3; 
p3=s.find("=")+2; 
l3=s.length()-s.find("=")-2; 
s1=s.substr(p1,l1); 
s2=s.substr(p2,l2); 
s3=s.substr(p3,l3); 
+2

「find()」が有効かどうかを確認してから、先に進んでください。 – user0042

+3

もっと考えてみよう:世界中のほとんどの開発者が徹底的にテストした(使い方によって) 'std :: getline'や' std :: string'の不明なバグがあります。それが現実に合っていない(あるいは、あなたのコードにUBがあるかもしれません)か? [mcve](問題を再現するために使用された入力を含む)を入力してください。 –

+2

値を読み取ろうとした後で*結果を使用する前に*入力が成功したかどうかを常に**確認する必要があります。 –

答えて

0

problem the OP are trying to solve状態の入力仕様:

入力ファイルの最初の行には、テストケースの数を指定する整数Tが含まれています。各テストケースの前に空白行があります。このアプローチの問題は、最初ignoreは末尾の改行は全て、cin >> t;によりストリームバッファに残っ消費しながら、ということである

int t; 
cin >> t; 
cin.ignore(INT_MAX,'\n'); 
for(int u=0; u<t; u++) 
{ 
    // ... 
    std::string s; 
    // cin.ignore(INT_MAX,'\n'); <-- another attempt 
    getline(cin, s); 
    // ... various operations involving s 
} 

:のようにそれに対処する

OP試行が要約することができます。 getlineで読み取られた他の空行(改行のみで構成される行)は空文字列になり、次のコードはそのような文字列を処理できません。

例えば、std::basic_string::findが渡された部分文字列を見つけることができないとき、それは

static const size_type npos = -1; 

として定義されてstd::basic_string::nposを返しますので、p21するまで終了し、ために私たちの呼び出しs.substr(p2,l2);は、std::out_of_range例外がスローされます位置1からゼロサイズの文字列から部分文字列を抽出しようとしています。

コメントアウトされたignore行を追加すると問題が解決する可能性がありますが、 p:

+0

をチェックしたい場合は、あなたは私のゴミコードを通過するあなたの努力に感謝します。 SIGABRTのオンライン定義は忘れていました。 –