最近写了做题时写了两个程序,总是出现越界的情况。
程序一
#include<iostream>
#include<string>
using namespace std;
int main()
{
string n;
cin >> n;
int sum = 0;
for (size_t i = 0; i < n.length(); i++) sum += n.at(i) - '0';
string *numTopinyin = new string[10]{"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
string res = to_string(sum);
// for (size_t j = 0; j < res.length(); j++)
for (size_t j = res.length() - 1; j >= 0; j--)
{
int index = res.at(j) - '0';
cout << numTopinyin[index];
if (j != res.length() - 1)
cout << " ";
}
}
1234568
jiuer terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::at: __n (which is 18446744073709551615) >= this->size() (which is 2)
程序二
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
getline(cin, s);
// int i = s.length() - 1;
// while(i >= 0)
for(size_t i = s.length() - 1; i >= 0; i--)
{
if(i == 0 || s.at(i - 1) == ' ')
{
size_t j = i;
while(j != s.length() && s.at(j) != ' ')
cout << s.at(j++);
if (i != 0)
cout << " ";
}
}
}
hello world my name is
is name my world helloterminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::at: __n (which is 18446744073709551614) >= this->size() (which is 22)
起初给程序一debug时,想了很久没想通。
今天写完程序二,又是这种错误,而且错误中的数字几乎是一样的,便又重新开始debug。
调试了很多遍,前面都是正确的,在 i = 0 之后,i 就变得非常大,然后就退出了。
我尝试着将 size_t 换成 int 后,运行时会有 warning ,意思是 int 类型和 length() 返回值类型不匹配,但是结果不会抛出越界的异常。
于是我发觉 size_t 类型数据似乎是无符号的,即它只能用来表示非负数。
而在上面两个程序中, for 循环中的条件都为 >= 0 ,当 i = 0 后,i 再次自减,就会变成 -1 ,超出了 size_t 类型能表示的数据范围。
而这个异常在循环结束时发生,所以程序能显示正确答案,但是在答案后面会抛出异常。
解决办法就是,用 int 替换 size_t ,或者重写循环,使之在 0 时退出,而不是 -1 。