无法将 'std::string' 转换为 'const char*'

12
这段代码有什么问题?
string s = getString(); // Return string

if(!strcmp(s, "STRING")) {
    // Do something
}

在编译过程中,我遇到了以下错误:
错误:无法将 'std::string' 转换为 'const char*',用于参数 '1',以便于 'int strcmp(const char*, const char*)'。

2
你想要 if (s == "STRING"),而 strcmpconst char* 版本。(你可以使用 if(!strcmp(s.c_str(), "STRING")),但不要这样做。) - BoBTFish
1
你有没有查看 strcmp 的文档以了解它接受什么参数?既然已经有定义了 operator==std::string,为什么还要像那样使用 strcmp 呢? - Jon
5
在这种情况下,@BoBTFish中的s == "STRING" - ForEveR
5
@Rakkun说:"那不是好的编程实践......" std::string类型重载了与const char *的比较运算符,以避免像您建议的代码一样创建std::string临时对象。 - Tony Delroy
4
C++ 的美在于 string == "foo" 意思与字面上完全一致。 - stefan
显示剩余3条评论
5个回答

31

strcmp函数接受const char*作为参数。你可以使用c_str方法:

if(!strcmp(s.c_str(),"STRING"))

或者只需使用重载的 operator== 用于 std::string

if(s == "STRING")

我打算使用 if (s == "STRING"),但我可以使用 if(getString() =="STRING") 替代吗? - Haris
我的代码就像这个 http://pastebin.com/raw.php?i=rDcPApix 如果我这样写 if (s == "STRING") 我会得到结果。 - Haris
你的代码对我有效。示例 - awesoon
嗨,谢谢您的回复。那是我的编程问题,不过我已经解决了。 - Haris

12

你需要使用 s.c_str() 来获取一个 std::string 的 C 字符串版本,例如:

if (!strcmp (s.c_str(), "STRING")) ...

但我不确定为什么你不直接使用:

if (s == "STRING") ...

这样更易读。


5

您可以像其他答案中那样,在std::string上使用c_str()方法。

您也可以直接这样做:

if (s == "STRING") { ... }

哪种方法更加清晰,并且不会让你误以为你在编写C语言代码。


1

如果你想保留C方式比较字符串,那么你必须使用std::stringc_str()成员函数来获取底层的char数组。

否则,你应该使用operator==来测试字符串和const char*之间的相等性。


1

你需要使用 c_str(),这应该能解决你的问题。


2
那是一种方式,但它是更糟糕的方式。 - BoBTFish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接