关于size_t类型数据的越界

最近写了做题时写了两个程序,总是出现越界的情况。

程序一

#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 。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值