为什么在编译此代码时会出现此错误?(在~之后调用terminate)

Why this error happens when I compile this code? (terminate called after~)

本文关键字:之后 terminate 调用 代码 编译 为什么 错误      更新时间:2023-10-16

我正在解决以下算术问题
输入的第一行包含一个整数N,(1≤N≤1000(,这是后面的数据集数量。每个数据集由一行输入组成,其中包含一个浮点(双精度(数字、一个空间和要转换的测量的单位规范。单位规格是kg、lb、l或g中的一个,分别指千克、磅、升和加仑。

这是我的密码
编译此代码时,
'抛出实例后调用terminate

'sd::out_of_range'what((:basic_string::erase:__pos(即18446744073709551615(>此->尺寸(((即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;
}

您不能这样做:

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

它有未定义的bahavior。编译器对此发出警告—不要忽略它。编译器可以在此处自由地对求值进行重新排序,这样您就永远不知道哪一个求值发生在另一个求值之后。


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

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

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

string Ansarr[N];

您可以使用std::vector来代替

std:: vector<std:: string> Ansarr(N);