减去不同字符串的.size()函数值

Subtracting .size() function values of different strings

本文关键字:函数 size 字符串      更新时间:2023-10-16

最近我遇到了一个问题,而我试图在c++中减去两个字符串的.size()值。据我所知,size()返回字符串中的字符数。假设我有两个字符串pq, abs(p.size()-q.size())应该返回两个字符串长度的差值。但是当我运行这段代码时,它返回了一个突然变大的值。当我分别输出它们的长度,或者如果我将它们的长度值存储在不同的整数中,然后相减,它们会给我正确的答案。我还不知道为什么。

size()返回一个无符号值。然后,一个较小的无符号值减去一个较大的无符号值将在计算中向下流动,从而得到一个较大的负值。想象一下,如果你在汽车上有一个"滚动"的英里或公里计数器,当你滚过0时,它就变成了99999,这是一个很大的数字。

解决方案,假设您关心负差异是执行static_cast<int>(p.size() - q.size())(并将其传递给abs)。

size()的返回值是size_t (无符号整型)的个数因此,如果你用较小的数减去较大的数,你就会遇到问题,并且作为减法的结果得到较大的值。

参考std:: string::大小

std::string成员函数size()返回一个无符号值,所以如果p.size() < q.size(),表达式p.size()-q.size()不会求值为负数(它是无符号的,不能是负的),而是一个(通常)非常非常大的(无符号)数。

std::string s报告它们的大小为unsigned的某个宽度整数;这种类型有点像手表上的秒针:你可以把它从0向前上发条到59,但如果你继续顺时针上发条,它会在再次增加之前下降到0,而如果你逆时针上发条,你会倒数到0,然后跳到59,从那里开始倒数,AD无限。

假设你从一根长度为4的弦中减去一根长度为6的弦,这就像说"分针从4开始,逆时针旋转6分钟"——当你上了4分钟的发条,秒针已经在0了,你再上一分钟到59,最后一分钟带你到58。对于std::string::size_type,最大值不是59,它要大得多,但问题是一样的。结果总是积极的,所以不受abs的影响,但无论如何-不是你想要的!

实际最大值可以在#include <limits>之后用std::numeric_limits<std::string::size_type>::max()访问,不管值多少。

有很多方法可以解决这个问题。David Schwartz对Zola的回答的评论列出了一个很好的例子:std::max(p.size(),q.size())-std::min(p.size(),q.size()),你可以把它想象成"从较大的值中减去较小的值"。另一个选项是…
p.size() > q.size() ? p.size() - q.size() : q.size() - p.size()

…这意味着"如果p较大,则从它减去q,否则从q减去它(即p) "