为什么使用is_it_valid_color("yellow")
工作和输出FOUND IT
但使用is_it_valid_color(x.c_str());
不起作用?
我觉得它与空终止字符串有关。输出在控制台中看起来相同:
color: 'yellow'
FOUND IT
color: 'yellow'
const char *color_names[] = {"yellow", "green", "red"};
const int color_names_SIZE = 3;
void is_it_valid_color(const char* color) {
cout << "color: '" << color << "'" << endl;
for(int i = 0; i < color_names_SIZE; ++i) {
if(color == *(color_names + i)) {
cout << "FOUND IT" << endl;
break;
}
}
}
is_it_valid_color("yellow");
string x = "yellow";
is_it_valid_color(x.c_str());
答案 0 :(得分:5)
你不是在比较字符串,而是在比较指向字符串的指针。
第一个匹配,因为您的链接器已将两个字符串“黄色”合并到同一物理指针以节省内存。因此,他们的地址相同。
要比较实际字符串本身,请使用strcmp()
或类似字符。
答案 1 :(得分:3)
你在这里比较内存地址(在指针中)而不是字符串(空终止的字符序列):
if(color == *(color_names + i)) {
您需要使用std::strcmp
代替:
if(std::strcmp(color, *(color_names + i)) == 0) {
除非你因为上学原因需要,否则使用下标运算符比使用指针运算要清楚得多。
此外,c_str()绝对是空终止。
答案 2 :(得分:3)
你不应该使用'=='运算符来比较char *的
相反,您应该在cstring库中使用strcmp函数
for(int i = 0; i < color_names_SIZE; ++i) {
if(strcmp(color,color_names[i]) == 0) {
cout << "FOUND IT" << endl;
break;
}
}
答案 3 :(得分:0)
重写代码的一部分,你(据称)比较字符串。
毫无疑问,c_str()和char *都是空终止的。
答案 4 :(得分:0)
你在比较指针而不是字符串。简单的解决方法是更改
const char *color_names[] = {"yellow", "green", "red"};
到
std::string color_names[] = {"yellow", "green", "red"};
尽量不要在任何地方使用指针,它们只会带来麻烦,尤其是在你学习的时候。你没有添加指针的所有复杂性就足够了解。