为什么在编译此代码时会发生此错误? (终止后称为〜)

时间:2019-10-28 05:53:22

标签: c++ c++11

我正在解决以下算法问题
输入的第一行包含一个整数N(1≤N≤1000),它是后面的数据集的数量。 每个数据集由单行输入组成,其中包含浮点(双精度)数字,空格和要转换的度量单位规格。单位规格为公斤,磅,升或克中的一种,分别表示千克,磅,升和加仑。

这是我的代码。
当我编译这段代码时,
  '终止引发

实例后调用
  

'std :: out_of_range'what():basic_string :: erase:__pos(这是   18446744073709551615)> this-> size()(0)'

出现此错误。我不知道为什么会出现这个错误。
我在c ++ 11中使用Dev c ++和compile选项。

#include <iostream>
#include <cstring>
#include <sstream>
using namespace std;

string Convert(string data, int length);

int main()
{
int N;
cin>>N;
int temp(N);
string Ansarr[N];
int i=0;
while(temp>0){
    string A;
    cin>>A;
    int len=A.length();
    A=Convert(A,len);
    Ansarr[i++]=A;
}
i=0;
while(N>0){
    cout<<i+1<<' '<< Ansarr[i++]<<endl;
    }
}

string Convert(string data, int length)
{
string Result,unit;
double ConResult;
if(data.back()=='g'){
    if(data.at(length-2)=='k'){
        /*kg일때*/
        unit="lb";
        data.pop_back();
        data.pop_back();
        data.pop_back();
        double temp=stoi(data);
        ConResult=temp*2.2046;
    }
    else{
        /*g일때*/ 
        unit="l";
        data.pop_back();
        data.pop_back();
        double temp=stoi(data);
        ConResult=temp*0.4536;
    } 
}
else if(data.at(length-1)=='b'){
    /*lb일때*/ 
    unit="kg";
    data.pop_back();
    data.pop_back();
    double temp=stoi(data);
    ConResult=temp*0.2642;
} 
else{
    /*ㅣ일때*/ 
    unit="g";
    data.pop_back();
    data.pop_back();
    double temp=stoi(data);
    ConResult=temp*3.7854;
}
Result=to_string(ConResult);
Result.resize(6);
Result=Result+" "+unit;
return Result;
}

1 个答案:

答案 0 :(得分:3)

您不能这样做:

cout<<i+1<<' '<< Ansarr[i++]<<endl;
//    ^^^               ^^^

它具有未定义的行为。编译器为此提供warning,请不要忽略它。编译器可以在此处自由地对评估进行重新排序,因此您永远不会知道哪个发生在另一个之后。


您需要对使用的每个at进行范围检查。 请注意,如果length-1由于溢出而length可能是一个很大的数字。因为0接受at。这是检查示例。

size_t

可变长度数组不是ISO C ++:

if (data.length() >= 2)
   data.at(data.length() - 2);

您可以改用std ::向量:

string Ansarr[N];