atoi偶尔出现未处理的异常(string.c_str())已更新

时间:2012-09-26 08:02:21

标签: c++ c exception exception-handling atoi

更新

我认为stoi(字符串)解决了它,但它只运行了一段时间。 我在下面添加了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'拆分字符串。当我调试时,savefile始终相同,第一个值为3.

这项工作有时候,可能每10次尝试一次。因此,在10次尝试中,每9次我在内存位置处得到未处理的异常。

监控转换后的值显示它始终返回3,然后应用程序不会崩溃,直到我开始游戏,这在代码中稍微进一步。

如果删除atoi并返回3,则应用程序正常工作。

我尝试过strtod,但没有帮助。

谢谢,

  • 马库斯

SplitString代码:

 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;
}

2 个答案:

答案 0 :(得分:0)

尝试使用strtol

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

答案 1 :(得分:0)

stoi(string)而不是atoi(string.c_str())解决了它。

更新: 它没有解决它。