为什么以下代码打印"否"?
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
const std::string abc = "hello";
if (abc.c_str() == "hello")
{
cout << "\nYES";
}
else
{
cout << "NO";
}
}
.c_str()
会返回const char*
而"hello"
应该被解释为const char*
或std::string
,两者都有效。但为什么不打印&#34;是&#34;。相反,strcmp()
会打印&#34;是&#34;但我的问题是上面的代码,这是一个编译器错误吗?
答案 0 :(得分:3)
&#34;你好&#34;应该被解释为const char *或std :: string都是有效的。
没有。 "hello"
永远不会被解释为std::string
。它的类型为const char[6]
,在这种情况下会转换为const char*
。这种数组转换称为衰减。
但为什么不打印YES。
比较两个指针时,比较它们是否指向同一个对象。您使用的指针比较不相等,因为字符串文字和std::string
的缓冲区不是同一个对象。
这是编译器错误吗?
没有。这是您代码中的错误。
那么你会建议使用c_str()和std :: string?
的正确方法
正确的方法是比较空终止字符数组的内容是std::strcmp
。
或者,您可以直接使用带有std::string
的比较运算符,而不使用c_str
返回的指针。 std::string
的比较运算符与空终止字符串的内容进行比较。
答案 1 :(得分:3)
它不是编译器错误。 abc.c_str()
给你一个指向std::string
数据缓冲区的指针的值,而且从C ++ 11开始,它不可能与文字地址{{ 1}}因为该标准禁止"hello"
的写时复制语义。 (我认为这在理论上可能在C ++ 03及更早版本中出于兴趣。)
如果您想将文字与std::string
进行比较,请使用
std::string
由于if (abc == "hello")
对std::string
运算符有适当的重载。
答案 2 :(得分:2)
abc.c_str()
是指向abc
对象的内部缓冲区的指针,然后您将使用返回false
的字符串文字“hello”进行指针比较。
答案 3 :(得分:1)
你正在比较错误的方法,试试:
而不是:
if (abc.c_str() == "hello")
使用:
if (!strcmp(abc.c_str(), "hello"))