在循环中使用 size_t 会抛出错误“std::length_error”

问题描述

我在 for 循环中遇到错误,如果 str.size() = 1 那么它会抛出错误

在抛出 'std::length_error' 实例后调用终止
what(): basic_string::_M_create

但如果 str.size() 大于 1,则一切顺利。 此外,当我将 size_t 更改为 int 时一切正常。为什么?

for (size_t i = str.size() - 1; i >= 0; i--)
        excess3(str[i]);

这里的str是字符串的向量

解决方法

size_t 是无符号类型,因此条件 i >= 0; 将始终评估为真,并且循环永远不会结束。

要么将 i >= 0 替换为 i != 0(并确保永远不要使用空向量进入循环),或者将循环变量从 size_t 更改为像 {{1} 这样的有符号类型}}。

,

size_t 是无符号的。如果 str.size() == 1 则 i 被初始化为 0。第一次通过循环是可以的。第二遍递减 i 并使其在无符号世界中变得非常大。在 32 位系统上,它将是 0xFFFFFFFF,当然它大于零。尝试 ssize_t 而不是 size_t。它是有符号的变体。这也是 int 有效的原因。