ADS*_*cci -1 c++ unhandled-exception
该代码具有头文件、实现文件和主文件。它应该增加字符串中所有字符的 ASCII 值,然后返回与该 ASCII 值关联的字符值。
有问题的代码如下:
for(int i = 0; i < sizeof(letters); i++)
{
if ((int)letters.at(i) >= (int)'a' && (int)letters.at(i) <= (int)'z')
{
letters.at(i) = (((letters.at(i) - 'a') + 1) % 26 + 'a');
}
else if ((int)letters.at(i) >= (int)'A' && (int)letters.at(i) <= (int)'Z')
{
letters.at(i) = (((letters.at(i) - 'a') + 1) % 26 + 'A');
}
}
Run Code Online (Sandbox Code Playgroud)
HomeworkNine.exe 中 0x750A3DB2 处的未处理异常:Microsoft C++ 异常:内存位置 0x00EFF7E8 处的 std::out_of_range。发生了
我看不出越界在哪里,因为我认为模数会解决这个问题。
sizeof(letters)仅当letters是 的普通数组时才是正确的char,因为普通数组没有at成员函数,所以不能。atC++ 标准库中的成员函数与size()for 随机访问序列进行比较,std::out_of_range如果索引不小于size(). 您需要替换sizeof(letters)为letters.size().
请注意,大写分支有一个错误,即 do-'a'和 then +'A'。
这些强制转换int是不必要的,因为编译器会为您执行这些转换(或者unsigned如果char在您的平台上未签名)。内置算术运算符和比较仅适用于int或更大的类型,请参阅积分提升。
替代 C++11 版本:
std::string letters("abc..zABC..Z");
for(auto& c : letters) {
if(std::isalpha(c))
c += std::tolower(c) != 'z' ? 1 : ('a' - 'z');
}
Run Code Online (Sandbox Code Playgroud)