比较字符串元素与字符串

use*_*865 12 c++ string

打印以下代码

1
0
Run Code Online (Sandbox Code Playgroud)

我一直在想如果比较使用相同的字符串,为什么值不同......我一直在努力解决这个问题,并且无法弄清楚为什么它们会返回不同的布尔值.

int main()
{
    string stringArray[] = { "banana","Banana","zebra","apple","Apple","Zebra","cayote" };

    cout << (stringArray[1] < stringArray[0]) << endl;
    cout << ("Banana" < "banana") << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

eml*_*lai 16

stringArray[n]是一个std::string,但是"Banana"是一个字符串文字(一个chars 数组).

执行此操作时"Banana" < "banana",两个字符串文字都会隐式转换为char指向char数组的指针.<然后比较那些内存地址.


Nat*_*ica 8

"Banana" < "banana"不比较字符串的内容.它正在比较"Banana""banana"解决的指针.

要比较cstyle字符串而不将其转换为a,std::string您可以使用strcmp().

  • @Ben:创建一个临时`std :: string`就足够了.虽然为了便于阅读,我也可能会这样做. (2认同)

Chr*_*ckl 7

string stringArray[] = { "banana","Banana","zebra","apple","Apple","Zebra","cayote" };
Run Code Online (Sandbox Code Playgroud)

这意味着您将获得一堆std::string对象,这些对象是从char const*单个字符串文字生成的s 创建的.

考虑单个std::string初始化:

std::string s = "...";
Run Code Online (Sandbox Code Playgroud)

右边的字面是类型的char const[4].据"衰变"到char const*所用std::string的构造.

std::string从字符串文字初始化对象数组时也会发生同样的情况.

cout << (stringArray[1] < stringArray[0]) << endl;
Run Code Online (Sandbox Code Playgroud)

因为std::string,使用<运算符意味着词典比较.因此,这使用词典比较并具有预期的结果.

cout << ("Banana" < "banana") << endl;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,没有std::string涉及.你们两个char const[7]相互比较.

这是什么意思?事实证明,这是完全不同的事情.两个数组都"衰减"到char const*第一个元素.比较两个不相关的指针的结果<未指定的.你很幸运收到0因为你可能会收到1并且没有注意到错误.编译器也可以为此生成警告,例如:

warning: comparison with string literal results in unspecified behaviour
Run Code Online (Sandbox Code Playgroud)

因此,正如您所看到的,此操作与词典比较完全无关.

解决此问题的一种方法是将至少一个操作数转换为std::string:

cout << (string("Banana") < "banana") << endl;
Run Code Online (Sandbox Code Playgroud)

a 和a <之间的比较(或反之亦然)被定义为词典.std::stringchar const*