最近我在尝试在c ++中减去两个字符串的.size()
值时遇到了问题。据我所知,size()
返回字符串中的字符数。因此,假设我有2个字符串p
和q
,abs(p.size()-q.size())
应该返回两个字符串长度的差异。但是当我运行这段代码时,它返回了一个突然大的值。当我单独打印两者的长度或者如果我将它们的长度值存储在不同的整数中并减去它们时,它们会给我正确的答案。我还不知道原因。
答案 0 :(得分:3)
size()
返回无符号值。然后,较小的无符号值减去较大的无符号值会使计算下溢,从而产生较大的负值。可以把它想象成你在汽车中有几英里或公里的“滚动”计数器,然后你回到0,它变成99999,这是一个很大的数字。
假设您关注负面差异,解决方案是static_cast<int>(p.size() - q.size())
(并将其传递给abs
)。
答案 1 :(得分:3)
返回值size()的值是size_t的数量(无符号整数类型) 因此,如果你从较小的数字中减去更大的数字,你就会遇到问题并因减法而得到那么大的数值。
答案 2 :(得分:1)
std::string
成员函数size()
会返回无符号值,因此如果p.size() < q.size()
,则表达式p.size()-q.size()
将不会计算为负数(它是无符号的,不能为负数)但是对于(通常)非常大(无符号)的数字。
答案 3 :(得分:1)
std::string
报告其大小为unsigned
整数的宽度;这类型有点像手表上的秒针:你可以将它从0向上卷绕到59但是如果顺时针旋转它会再次增加前降为0,而如果你逆时针旋转你倒数到0然后跳到59在减少之前。
假设你从字符串长度4中减去字符串长度6,这就像说“在4点开始分针并逆时针旋转6分钟” - 当你已经用4秒钟后退了秒针时在0,然后再刮到另一分钟到达59,最后一分钟将你带到58.对于std::string::size_type
,最大值不是59 - 它更大 - 但问题是相同的。结果总是正面的,所以不受abs
的影响,但不管 - 不是你想要的!
#include <limits>
std::numeric_limits<std::string::size_type>::max()
之后可以使用std::max(p.size(),q.size())-std::min(p.size(),q.size())
访问实际最大值,无论价值多少。
有很多方法可以解决这个问题。大卫施瓦茨对佐拉答案的评论列出了一个很好的答案:p.size() > q.size() ? p.size() - q.size() : q.size() - p.size()
。另一种选择是:
{{1}}