以下是代码片段,它会产生运行时错误“Microsoft Visual C ++运行时库”http://www.flickr.com/photos/66130188@N07/6023459646/
string text = something;
size_t index = text.find("hoopla");
try{
if(text.at(index-1)<'0'&&text.at(index-1)>'9')
return false;
}catch(out_of_range){return true;}
我在Qt创建者中运行它。它不会触发catch块。当到达text.at(index-1)和index-1的程序超出范围时,它会在Qt中创建运行时错误http://www.flickr.com/photos/66130188@N07/6023453724/
当我使用MVS2010时,我没有遇到任何问题。有什么建议吗?
答案 0 :(得分:1)
只需先检查find
的返回值
if ((index == std::string::npos || index == 0) ||
(text[index - 1] < '0' && text[index - 1] > '9') )
{
return false;
}
在第一种情况下,npos
,找不到搜索字符串,在第二种情况下,它位于环境字符串的开头,因此您无法查看其前面的字符。
(这称为“攻击性编程”:不要在运行时检查错误,而是构建算法,以便知道您的访问权限是正确的。如果愿意,您可以添加断言 assert(index < text.length());
表示您确定您持有正确的值,这不会影响您的发布版本。)
更新:取代.at()
[]
,因为我们确信自己。