【问题标题】:Comparing strings lexicographically按字典顺序比较字符串
【发布时间】:2013-01-12 19:38:20
【问题描述】:

我认为如果我在 c++ 中使用诸如“>”和“

if("aa" > "bz") cout<<"Yes";

这不会打印任何内容,这就是我需要的,但是如果我输入

if("aa" > "bzaa") cout<<"Yes";

这将打印“是”,为什么会这样?或者我应该使用其他方法来按字典顺序比较字符串?

【问题讨论】:

  • 问题是 "aa" 和 "bz" 不是 string 的。是时候告诉教程作者和教师将 “” 之间的东西称为“文本文字”而不是“字符串”了。它将消除新手的大部分困惑和头痛!

标签: c++ string compare


【解决方案1】:

比较std::string -s 这样工作。但是,您正在比较字符串文字。要进行比较,您需要使用它们初始化 std::string 或使用 strcmp:

if(std::string("aa") > std::string("bz")) cout<<"Yes";

这是 c++ 风格的解决方案。

或者:

if(strcmp("aa", "bz") > 0) cout<<"Yes";

编辑(感谢 Konrad Rudolph 的评论):事实上,在第一个版本中,只有一个操作数应该被显式转换:

if(std::string("aa") > "bz") cout<<"Yes";

将再次按预期工作。

编辑(感谢 churill 的评论):从 c++14 开始,您可以使用字符串文字:

if("aa"s > "bz") cout<<"Yes";

【讨论】:

  • 只有一个操作数需要显式转换。
  • 谢谢,这就是我需要知道的全部内容。
  • @KonradRudolph 是的。谢谢你。
  • 我想补充一点,因为 C++14 你可以用string literals -> if("aa"s &gt; "bz") 写得更短。
  • @churill 谢谢你的补充,我已经在我的回答中反映了这一点。
【解决方案2】:

您正在比较 char const * 类型的“原始”字符串。

以下内容基本上等同于您的示例:

char const * s1 = "aa";
char const * s2 = "bz";
if ( s1 > s2 ) cout<<"Yes";

这是比较指针(字符串的内存地址),而不是内容。

@izomorphius 提出了一些好的解决方案。

【讨论】:

    【解决方案3】:

    您可以使用 #include &lt;cstring&gt; 头文件中包含的 strcmp() 函数。 strcmp() 逐字符比较两个字符串。该过程将继续进行,直到达到NULL 或其中一个字符串变得不相等(字符变得不相等)。 例如:

    #include <iostream>
    #include <cstring>
    
    
    void display(char *lhs, char *rhs, int result)
    {
        if(result > 0)
            std::cout << rhs << " precedes " << lhs << std::endl;
        else if (result < 0)
            std::cout << lhs << " precedes " << rhs << std::endl;
        else
            std::cout << lhs << " and " << rhs << " are same" << std::endl;
    }
    
    int main()
    {
        char lhs[] = "aa";
        char rhs[] = "bz";
        int result;
    
        result = strcmp(lhs,rhs);
        display(lhs,rhs,result);
    
        result = strcmp(lhs,lhs);
        display(lhs,lhs,result);
    
        return 0;
    }
    

    输出:

    aa precedes bz
    aa and aa are same
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 2018-05-17
      • 2019-11-04
      相关资源
      最近更新 更多