0

为什么使用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());
4

5 回答 5

5

您不是在比较字符串,而是在比较指向字符串的指针。

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

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

于 2013-10-08T05:59:49.007 回答
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;
    }
}

http://en.cppreference.com/w/cpp/string/byte/strcmp

于 2013-10-08T06:00:25.117 回答
3

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

if(color == *(color_names + i)) {   

您需要std::strcmp改用:

if(std::strcmp(color, *(color_names + i)) == 0) {   

除非您出于教育原因需要,否则使用下标运算符比使用指针算术更清楚。

此外, c_str() 绝对是空终止的。

于 2013-10-08T05:58:49.000 回答
0

You're comparing pointers not strings. Simple fix is to change

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

to

std::string color_names[] = {"yellow", "green", "red"};

Try not to use pointers anywhere, they only cause trouble, especially when you are learning. You have enough to learn without adding all the complexities of pointers.

于 2013-10-08T06:05:02.917 回答
0

重写代码的一部分,你(据称)比较字符串。

毫无疑问, c_str() 和 char* 都是空终止的。

于 2013-10-08T06:01:59.430 回答