为什么在编译此代码时会出现此错误?(在~之后调用terminate)
Why this error happens when I compile this code? (terminate called after~)
我正在解决以下算术问题
输入的第一行包含一个整数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);
相关文章:
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 在类定义之后定义一个私有方法
- 在循环C++中指定字符串之后,不会打印该字符串
- C++宏忽略之后的内容
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- strncpy之后的char数组的错误行为
- 计算十进制 c++ 之后的数字
- "x += x--"之后的 x 是什么?
- 类的前向声明之后的类成员函数定义,在类声明之前
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- execlp() 在 fork() 之后无法正常工作
- 我认为我的代码很好,但它在 cin a 之后停止并且没有进一步?
- 如何在MISRA C++之后实施CRTP
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- 在 OpenCV 的 namedWindow 之前或之后初始化 Tesseract
- 检测到堆损坏:在正常块 c++ 动态 2D 数组之后
- C++ 如果在 if 为 true 之后运行,为什么还会这样做
- 在 fork() 之后,我在我的程序中不断得到相同的 pid
- OpenSSL C API:如何在程序exec()之后恢复TLS连接?
- 为什么在编译此代码时会出现此错误?(在~之后调用terminate)