ray*_*ond 23 c++ string equality
任何想法为什么我得到"玛雅不是玛雅"这个代码的结果?
if ("Maya" == "Maya")
printf("Maya is Maya \n");
else
printf("Maya is not Maya \n");
Run Code Online (Sandbox Code Playgroud)
Geo*_*che 48
因为你实际上在比较两个指针 - 例如使用以下之一:
if (std::string("Maya") == "Maya") { /* ... */ }
if (std::strcmp("Maya", "Maya") == 0) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
这是因为C++ 03,§2.13.4说:
普通字符串文字的类型为" n的 数组
const char"
...在您的情况下,转换为指针适用.
另请参阅此问题,了解为何不能==为此情况提供重载.
Pau*_*han 18
您不是在比较字符串,而是在比较指针地址的相等性.
更明确 -
"foo baz bar"隐含地定义了一个匿名者const char[m].它是实现定义的,相同的匿名const char [m]是否指向内存中的相同位置(一种称为实习的概念).
你想要的函数 - 在C中 - 是strmp(char*,char*),它在相等时返回0.
或者,在C++中,您可能会做的是
#include <string>
std::string s1 = "foo"
std::string s2 = "bar"
然后将s1与s2与==运算符进行比较,运算符以直观的方式定义为字符串.
程序的输出是实现定义的.
字符串文字具有类型const char[N](即,它是一个数组).程序中的每个字符串文字是否由唯一数组表示是实现定义的.(§2.13.4/ 2)
进行比较时,数组会衰减成指针(到第一个元素),然后进行指针比较.如果编译器决定将两个字符串文字存储为同一个数组,则指针比较为true; 如果他们每个人都有自己的存储空间,他们会比较假.
要比较字符串,请使用std::strcmp(),如下所示:
if (std::strcmp("Maya", "Maya") == 0) // same
Run Code Online (Sandbox Code Playgroud)
通常你会使用标准的字符串类std::string.它定义了operator==.您需要创建一个文字std::string来使用该运算符:
if (std::string("Maya") == "Maya") // same
Run Code Online (Sandbox Code Playgroud)
任何想法为什么我得到"玛雅不是玛雅"的结果
因为在C中,因此在C++中,当您尝试比较它们时,字符串文字是类型const char[],它被隐式转换为const char*指向第一个字符的指针.指针比较是地址比较.
两个字符串文字是否比较相等取决于您的编译器(使用当前设置)是否汇集字符串文字.允许这样做,但它不需要..
比较C字符串,用strcmp()从<string.h>头部.(它std::strcmp()来自<cstring>C++.)
要在C++中这样做,最简单的方法是将其中一个转换为std::string(来自<string>标题),它带有所有比较运算符,包括==:
#include <string>
// ...
if (std::string("Maya") == "Maya")
std::cout << "Maya is Maya\n";
else
std::cout << "Maya is not Maya\n";
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1996 次 |
| 最近记录: |