Случайное необработанное исключение с atoi(string.c_str()) Обновлено

ОБНОВИТЬ

Я думал, что stoi(string) решил эту проблему, но это сработало ненадолго. Я добавил код для splitString и расшифровал его ниже.

Время от времени я получаю необработанные исключения с atoi(), используя одно и то же предполагаемое значение.

Мой код выглядит так:

ifstream myfile ("Save.sav");
string line = "";
if (myfile.is_open())
{
    while ( myfile.good() )
    {
        getline (myfile,line);

    }
    myfile.close();

    line = StaticFunctions::decrypt(line);

}
vector<string> splitString = StaticFunctions::splitString(line, 's');
return atoi(splitString[0].c_str());

Итак, что он делает, так это читает файл сохранения, затем расшифровывает его, а затем разбивает строку на каждую «s». Когда я отлаживаю, файл сохранения всегда один и тот же, а первое значение равно 3.

Это работает иногда, может быть, каждые 10 попыток. Итак, каждые 9 из 10 попыток я получаю необработанное исключение в... в ячейке памяти.

Мониторинг преобразованного значения показывает, что оно всегда возвращает 3, а затем приложение не падает, пока я не запущу игру, которая находится немного дальше в коде.

Если я удалю atoi и просто верну 3, приложение работает нормально.

Я пробовал strtod, но это не помогло.

Спасибо,

  • Маркус

Код разделения строки:

 vector<string> StaticFunctions::splitString(string str, char splitByThis)
 {
vector<string> tempVector;
unsigned int pos = str.find(splitByThis);
unsigned int initialPos = 0;

// Decompose statement
while( pos != std::string::npos ) {
    tempVector.push_back(str.substr( initialPos, pos - initialPos + 1 ) );
    initialPos = pos + 1;

    pos = str.find(splitByThis, initialPos );
}

// Add the last one
tempVector.push_back(str.substr(initialPos, std::min(pos, str.size()) - initialPos + 1));

return tempVector;

}

Расшифровать код (очень просто):

string StaticFunctions::decrypt(string decryptThis)
{
for(int x = 0; x < decryptThis.length(); x++)
{
    switch(decryptThis[x])
    {
        case  '*':
        {
            decryptThis[x] = '0';
            break;
        }
        case  '?':
        {
            decryptThis[x] = '1';
            break;
        }
        case  '!':
        {
            decryptThis[x] = '2';
            break;
        }
        case  '=':
        {
            decryptThis[x] = '3';
            break;
        }
        case  '#':
        {
            decryptThis[x] = '4';
            break;
        }
        case  '^':
        {
            decryptThis[x] = '5';
            break;
        }
        case  '%':
        {
            decryptThis[x] = '6';
            break;
        }
        case  '+':
        {
            decryptThis[x] = '7';
            break;
        }
        case  '-':
        {
            decryptThis[x] = '8';
            break;
        }
        case  '"':
        {
            decryptThis[x] = '9';
            break;
        }
    }
}
return decryptThis;
}

person Orujimaru    schedule 26.09.2012    source источник
comment
Не то чтобы это имело какое-либо отношение к вашей проблеме, но нет необходимости инициализировать line с помощью string line = "";; просто string line; создаст пустую строку.   -  person Gorpik    schedule 26.09.2012
comment
Можете ли вы опубликовать определение StaticFunctions::splitString()?   -  person hmjd    schedule 26.09.2012
comment
как реализованы StaticFunctions::splitString и StaticFunctions::decrypt? Может быть, они испортили строки, которые вы позже обрабатываете с помощью atoi?   -  person Zdeslav Vojkovic    schedule 26.09.2012
comment
Попробуйте std::stoi (C++11, работает с std::string вместо const char*). Если вы перепутаете строки, он выдаст либо invalid argument (если строку нельзя преобразовать в целое число), либо out_of_range (если целое число, представленное строкой, слишком велико). По крайней мере, вы будете знать, что не так.   -  person Cubic    schedule 26.09.2012
comment
Не используйте функцию good для проверки зацикливания, вместо этого сделайте, например. while (std::getline(...)).   -  person Some programmer dude    schedule 26.09.2012
comment
Спасибо за все предложения, использование stoi со строкой вместо atoi и const *char решило эту проблему.   -  person Orujimaru    schedule 26.09.2012
comment
Боюсь, что stoi(string) не решила проблему, она работала только какое-то время.   -  person Orujimaru    schedule 26.09.2012
comment
Можете ли вы сделать printf(-›%s‹- %ld\n,splitString[0].c_str(),strlen(splitString[0].c_str())); и посмотреть, что он производит?   -  person Scooter    schedule 26.09.2012
comment
он печатает:->3s‹- 2 независимо от того, падает приложение или нет.   -  person Orujimaru    schedule 26.09.2012


Ответы (2)


Попробуйте вместо этого использовать strtol

strtol (splitString[0].c_str(),NULL,10);

person Jram    schedule 26.09.2012

stoi(string) вместо atoi(string.c_str()) решил это.

ОБНОВЛЕНИЕ: это не решило.

person Orujimaru    schedule 26.09.2012