Почему эта ошибка происходит, когда я компилирую этот код? (прекратить вызывать после ~) - PullRequest
0 голосов
/ 28 октября 2019

Я решаю следующую проблему алогрита
Первая строка ввода содержит одно целое число N (1 ≤ N ≤ 1000), которое представляет собой число следующих наборов данных. Каждый набор данных состоит из одной строки ввода, содержащей число с плавающей запятой (двойной точности), пробел и спецификацию единицы измерения для измерения, которое необходимо преобразовать. Единица измерения - это кг, фунт, л или g, относящиеся к килограммам, фунтам, литрам и галлонам соответственно.

А вот мой код.
Когда я компилирую этот код,
'прекращение вызова после выброса экземпляра

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

появляется эта ошибка. Я понятия не имею, почему появляется эта ошибка.
Я использую Dev c ++ и опцию компиляции в c ++ 11.

#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 Ответ

3 голосов
/ 28 октября 2019

Вы не можете сделать это:

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

У него неопределенное поведение. Компилятор выдает предупреждение , не игнорируйте его. Компилятор может свободно переупорядочивать оценки здесь, чтобы вы никогда не знали, какая из них происходит после другой.


Вам необходимо проверять диапазон для каждого используемого вами at. Обратите внимание, что length-1 может быть действительно большим числом, если length было 0 из-за переполнения. Потому что at принимает size_t. Вот пример проверки.

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

Массив переменной длины не соответствует ISO C ++:

string Ansarr[N];

Вместо него можно использовать std :: vector:

std:: vector<std:: string> Ansarr(N);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...