27

我认为如果我在 C++ 中使用诸如“>”和“<”之类的运算符来比较字符串,这些会按字典顺序比较它们,问题是这有时只在我的计算机中有效。例如

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

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

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

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

4

3 回答 3

39

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

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

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

或者:

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

编辑(感谢康拉德鲁道夫的评论):事实上,在第一个版本中,只有一个操作数应该被显式转换,所以:

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

将再次按预期工作。

编辑(感谢 churill 的评论):因为 c++14 你可以使用字符串文字:

if("aa"s > "bz") cout<<"Yes";
于 2013-01-12T19:39:36.787 回答
7

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

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

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

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

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

于 2013-01-12T20:04:23.770 回答
0

您可以使用strcmp()包含在#include <cstring>头文件中的函数。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
于 2020-07-24T20:23:21.543 回答