按字典顺序比较字符串

slu*_*ugo 19 c++ string compare

我认为如果我在c ++中使用诸如">"和"<"之类的运算符来比较字符串,那么它们会按字典顺序对它们进行比较,问题是这只会在我的计算机中有效.例如

if("aa" > "bz") cout<<"Yes";
Run Code Online (Sandbox Code Playgroud)

这将不打印,这就是我需要的,但如果我输入

if("aa" > "bzaa") cout<<"Yes";
Run Code Online (Sandbox Code Playgroud)

这将打印"是",为什么会发生这种情况?或者我是否应该使用其他方式来按字典顺序比较字符串?

izo*_*ica 25

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

if(std::string("aa") > std::string("bz")) cout<<"Yes";
Run Code Online (Sandbox Code Playgroud)

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

或者:

if(strcmp("aa", "bz") > 0) cout<<"Yes";
Run Code Online (Sandbox Code Playgroud)

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

if(std::string("aa") > "bz") cout<<"Yes";
Run Code Online (Sandbox Code Playgroud)

将再次按预期工作.

  • 只需要显式转换一个操作数。 (3认同)
  • 我想补充一点,从 C++14 开始,您可以使用 [字符串文字](https://en.cppreference.com/w/cpp/string/basic_string/operator""s) -&gt; 将其写得更短`if("aa"s &gt; "bz")`。 (3认同)

nob*_*bar 7

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

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

char const * s1 = "aa";
char const * s2 = "bz";
if ( s1 > s2 ) cout<<"Yes";
Run Code Online (Sandbox Code Playgroud)

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

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