【问题标题】:Subtracting .size() function values of different strings减去不同字符串的 .size() 函数值
【发布时间】:2015-10-05 07:28:05
【问题描述】:

最近我在尝试用 c++ 减去两个字符串的 .size() 值时遇到了一个问题。据我所知,size() 返回字符串中的字符数。所以假设我有 2 个字符串 pqabs(p.size()-q.size()) 应该返回我两个字符串长度的差异。但是当我运行这段代码时,它返回了一个突然变大的值。当我单独打印两者的长度时,或者如果我将它们的长度值存储在不同的整数中并减去它们,它们会给我正确的答案。我还不知道为什么。

【问题讨论】:

  • .size() 返回size_t,它是一个无符号整数,因此会溢出。
  • 顺便说一句,size 返回的字节数可能与字符数不同。

标签: c++ string unsigned


【解决方案1】:

size() 返回一个无符号值。较小的无符号值减去较大的值会导致计算下溢,从而导致较大的负值。可以把它想象成你在汽车中有里程或公里的“滚动”计数器,然后你回滚过去 0,它变成了 99999,这是一个很大的数字。

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

【讨论】:

  • 在 64 位系统上,int 可能比 size_t 小很多。如果您知道您的字符串可能超过 2GB,请使用long long
  • @MSalters:是的,我们在这里经常看到的一个常见问题... ;)
【解决方案2】:

size() 的返回值是 size_t 的个数(无符号整数类型) 因此,如果您从较小的数字中减去较大的数字,您将遇到问题并通过减法获得较大的值。

参考std::string::size

【讨论】:

  • 一个常见的模式是std::max(p.size(),q.size())-std::min(p.size(),q.size())
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    std::strings 将它们的大小报告为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() 之后访问,不管它值多少钱。

    有很多方法可以解决这个问题。 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)”.

    【讨论】:

      猜你喜欢
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多