NULL прекращено c_str ()?

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());
Теги:
string
c-strings
null-terminated

5 ответов

5
Лучший ответ

Вы не сравниваете строки, вы сравниваете указатели на строки.

Первый соответствует, потому что ваш компоновщик объединил две строки "желтый" с одним и тем же физическим указателем на сохранение памяти. Поэтому их адреса сравниваются одинаково.

Чтобы сравнить фактические строки, используйте strcmp() или аналогичные.

3

Вы не должны использовать оператор '==' для сравнения с char *

вместо этого вы должны использовать функцию strcmp в библиотеке cstring

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

Ваши сравнительные адреса памяти (в указателях) вместо строк (нулевые завершаемые последовательности символов) здесь:

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

std::strcmp этого вам нужно использовать std::strcmp:

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

Если вам не нужны причины для обучения, гораздо проще использовать оператор индекса, чем использовать арифметику указателя.

Кроме того, c_str() определенно завершено нулем.

0

Перепишите часть кода, где вы (предположительно) сравниваете строки.

И не сомневайтесь, c_str() и char * оба завершены с нулевым значением.

0

Вы сравниваете указатели, а не строки. Простое исправление - изменить

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

в

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

Старайтесь не использовать указатели в любом месте, они только вызывают проблемы, особенно когда вы учитесь. У вас достаточно, чтобы учиться, не добавляя всех сложностей указателей.

  • 0
    На самом деле, проект посвящен изучению работы указателей, и мне нужно продолжать учиться :)
  • 0
    Хорошо, одна из сложностей char * заключается в том, что иногда он ведет себя как указатель, а иногда ведет себя как строка. Вы были неудачны, предполагая, что он вел себя как строка, хотя на самом деле он был указателем. Если вам нужно продолжать использовать char *, то, как сказали другие, ответом будет strcmp.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню