比较字符串元素与字符串

时间:2015-10-28 16:58:44

标签: c++ string

以下代码打印

1
0

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

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

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

    return 0;
}

3 个答案:

答案 0 :(得分:16)

stringArray[n]std::string,但"Banana"是字符串文字(char s的数组)。

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

答案 1 :(得分:8)

"Banana" < "banana"没有比较字符串的内容。它正在比较"Banana""banana"解析的指针。

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

答案 2 :(得分:7)

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

这意味着您将获得一堆std::string个对象,这些对象是从char const*创建的,这些对象来自各个字符串文字。

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

std::string s = "...";

右侧的文字属于char const[4]类型。它“衰减”为char const*构造函数使用的std::string

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

cout << (stringArray[1] < stringArray[0]) << endl;

对于std::string,使用<运算符表示词典比较。因此,这使用词典比较并具有预期的结果。

cout << ("Banana" < "banana") << endl;

在这种情况下,不涉及std::string。您将两个char const[7]相互比较。

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

warning: comparison with string literal results in unspecified behaviour

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

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

cout << (string("Banana") < "banana") << endl;

<std::string之间的char const*比较(反之亦然)被定义为词典编纂。