NULL终止了c_str()?

时间:2013-10-08 05:56:20

标签: c++ string null-terminated c-strings

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

5 个答案:

答案 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;
    }
}

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

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

尽量不要在任何地方使用指针,它们只会带来麻烦,尤其是在你学习的时候。你没有添加指针的所有复杂性就足够了解。