C++ 以NULL结尾的c_str()?

C++ 以NULL结尾的c_str()?,c++,string,null-terminated,c-strings,C++,String,Null Terminated,C Strings,为什么使用是有效的颜色(“黄色”)工作并输出找到它,但使用是有效的颜色(x.c\u str())不工作 我觉得这与以null结尾的字符串有关。控制台中的输出看起来相同: color: 'yellow' FOUND IT color: 'yellow' const char*color_name[]={“黄”、“绿”、“红”}; const int color\u names\u SIZE=3; void是有效的颜色(常量字符*颜色){ 不能在此处比较内存地址(指针)而不是字符串(以null结

为什么使用
是有效的颜色(“黄色”)
工作并输出
找到它
,但使用
是有效的颜色(x.c\u str())不工作

我觉得这与以null结尾的字符串有关。控制台中的输出看起来相同:

color: 'yellow'
FOUND IT
color: 'yellow'

const char*color_name[]={“黄”、“绿”、“红”};
const int color\u names\u SIZE=3;
void是有效的颜色(常量字符*颜色){

不能在此处比较内存地址(指针)而不是字符串(以null结尾的字符序列):

您需要改用
std::strcmp

if(std::strcmp(color, *(color_names + i)) == 0) {   
除非出于学校教育的原因需要,否则使用下标运算符比使用指针算法更为清晰


另外,c_str()肯定以null结尾。

您不是在比较字符串,而是在比较指针和字符串

第一个匹配是因为链接器将两个“黄色”字符串合并到同一个物理指针以节省内存。因此,它们的地址比较相同


要比较实际字符串本身,请使用strcmp()
或类似方法。

您不应该使用“==”运算符来比较字符*

相反,您应该使用cstring库中的strcmp函数

for(int i = 0; i < color_names_SIZE; ++i) {
    if(strcmp(color,color_names[i]) == 0) {   
        cout << "FOUND IT" << endl;
        break;
    }
}
for(int i=0;i不能重写代码中比较字符串的部分


毫无疑问,c_str()和char*都以null结尾。

您正在比较指针而不是字符串。简单的解决方法是更改

const char *color_names[] = {"yellow", "green", "red"};


尽量不要在任何地方使用指针,它们只会带来麻烦,尤其是在你学习的时候。你有足够的时间去学习,而不需要增加指针的复杂性。

简短回答:使用
std::string
,问题就会消失。这个项目实际上是关于学习指针是如何工作的,显然我需要继续学习:)好的,好的char*的一个复杂性是,有时它的行为类似于指针,有时它的行为类似于字符串。不幸的是,您假设它的行为类似于字符串,而实际上它是指针。如果您必须继续使用char*,那么strcmp就是其他人所说的答案。
for(int i = 0; i < color_names_SIZE; ++i) {
    if(strcmp(color,color_names[i]) == 0) {   
        cout << "FOUND IT" << endl;
        break;
    }
}
const char *color_names[] = {"yellow", "green", "red"};
std::string color_names[] = {"yellow", "green", "red"};