【问题标题】:String Comparison return value (Is is used in applications that sorts characters ?)字符串比较返回值(是否用于对字符进行排序的应用程序?)
【发布时间】:2023-04-05 08:36:01
【问题描述】:

当我们使用strcmp(str1, str2);str1.compare(str2); 时,返回值分别为-1、0 和1,对于str1 str2。

问题是,这样定义是否出于特定原因? 例如,在二叉树排序算法中,我们将较小的值推送到左孩子,将较大的值推送到右孩子。这个 strcmp 或 string::compare 函数似乎是完美的。但是,是否有人使用字符串匹配来对树进行排序(整数索引更容易使用)?

那么,三个返回值(-1,0,1)的实际用途是什么。为什么不能只返回 1 为真,0 为假?

谢谢

【问题讨论】:

  • 返回值实际上不是(-1, 0, 1)。如果您查看reference documents,它只会显示小于零、零或大于零的值。对于整数,你可以说 return num1 - num2; ;对于字符串,类似。
  • @Bala R:实际上你不能像那样比较整数(下溢/上溢)。
  • @UncleBens:可以,因为该函数仅适用于 ASCII 文本。因此,可以假设所有输入都在 [0, 0x80) 范围内。
  • @Nicol: ... 并假设 char 是有符号类型?
  • @UncleBens:即使是有符号的,ASCII 也会停在 0x79,这是正数。如果值 >= 0x80,则它不是 ASCII 字符串。

标签: c++ string compare


【解决方案1】:

拥有三个返回值的目的正是它看起来的样子:一次回答所有关于字符串比较的问题。

每个人都有不同的需求。有些人有时需要一个简单的小于测试; strncmp 提供了这个。有些人需要平等测试; strncmp 提供了这个。有些人确实需要知道两个字符串之间的完整关系; strncmp 提供了这个。

你绝对不希望有人这样写:

if(strless(lhs, rhs))
{
}
else if(strequal(lhs, rhs))
{
}

这是在执行两个可能代价高昂的比较操作。 strless 也知道它们是否相等,因为它必须到达两个字符串的末尾才能返回它不小于。

哦,仅供参考:返回值不是 -1 或 +1;它大于零或小于零。如果它们相等,则为零。

【讨论】:

    【解决方案2】:

    这对于了解所有三种情况很重要的某些情况很有用。当您只关心布尔比较时,使用operator< 代替string

    【讨论】:

      【解决方案3】:

      可以,但是您需要多个函数来进行排序和比较。 strcmp() 返回更小、等于或更大的结果,您可以轻松地使用它们进行比较和排序。

      请记住,BST 并不是您想要比较字符串的唯一地方。您可能想要对姓名列表或类似内容进行排序。此外,将字符串作为树中的键也很常见。

      【讨论】:

        【解决方案4】:

        正如其他人所说,比较具有 == 含义的字符串是有实际目的的。例如;分配给字符串的固定长度数字将正确解析;即:“312235423”>“312235422”。在某些情况下,这很有用。

        但是,您要求的功能,解决方案的真/假仍然适用于给定的返回值。

        if (-1)
          {
             // resolves true
          }
        else if (1)
          {
             // also resolves true
          }
         else if (0)
          {
            // resolves false
          }
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-03
        • 2016-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多