比较字符串时出现意外结果

时间:2016-09-17 09:38:11

标签: c++ string compare

我正在比较这两个字符串:"code""test"

当我在Visual Studio中键入它时:

cout<<("t"<"c")<<endl;
cout<<("c"<"t")<<endl;
cout<<("code"<"test")<<endl;
cout<<("test"<"cose")<<endl;

结果是:

1
0
1
1

这是没有意义的,当我尝试在ideone.com上尝试时,结果变为:

0
1
1
1

这里出了什么问题?

2 个答案:

答案 0 :(得分:4)

您正在比较指针值,而不是字符串(注意:"cose"是一个与"code"不同的字面值,gu保证给出不同的指针。)

使用std::string标头中的<string>来获取有意义的字符串操作。

然后你也可以使用像"code"s这样的文字。

#include <iostream>
#include <string>
using namespace std;

auto main() -> int
{
    cout << boolalpha;
    cout << ("t"s < "c"s) << endl;
    cout << ("c"s < "t"s) << endl;
    cout << ("code"s < "test"s) << endl;
    cout << ("test"s < "cose"s) << endl;
}

正式提出问题中的代码,

cout<<("t"<"c")<<endl;
cout<<("c"<"t")<<endl;
cout<<("code"<"test")<<endl;
cout<<("test"<"cose")<<endl;

...具有实现定义的行为,因为

C ++11§5.9/ 2 2 nd dash(expr.rel):
  

如果同一类型的两个指针pq指向不是同一个对象或同一个数组的元素或不同的成员的不同对象函数,或者如果其中只有一个为null,则p<qp>qp<=qp>=q的结果未指定。

然而,您可以通过std::less和系列以明确定义的方式比较这些指针,因为

C ++ 11 20.8.5 / 8(比较):
  

对于模板greaterlessgreater_equalless_equal,任何指针类型的特化产生总订单,甚至如果内置运算符<><=>=没有。

但是在第三个抓握的手上,虽然指针比较在某些情况下很有用,但您可能想要比较字符串文字。标准库提供例如strcmp为了做到这一点。但最好使用std::string,如开头所述。

文字"code"表示不可变的以空值终止的char值字符串。对于最终的空字节,它总共有五个char值。因此类型为char const[5]

作为在期望指针的上下文中使用的表达式,表示此数组的表达式(即"code"文字)衰减为指向第一个项的指针,char const*指针。 / p>

这是数组表达式通常对指针的衰减,但在C ++ 03和更早版本中,还有一个特殊的文字规则,允许衰减只有char*(无const)。

注意:
¹两个相同的字符串文字可以提供不同的指针或相同的指针,具体取决于所使用的编译器和选项。 功能

答案 1 :(得分:2)

字符串文字,例如"t" < "c"实际上是常量字符数组(包括终结符)。

当你使用字符串文字时,你得到的是指向它的第一个字符的指针。

所以当你做"t" < "c"时,你正在比较两个不相关的指针。如果var m = [[1,2,3], [4,5,6]]; 为真,则取决于编译器决定放置字符串文字数组的位置。

如果您想比较字符串,则应使用std::string或旧的C函数strcmp