Почему использование 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());
Вы не сравниваете строки, вы сравниваете указатели на строки.
Первый соответствует, потому что ваш компоновщик объединил две строки "желтый" с одним и тем же физическим указателем на сохранение памяти. Поэтому их адреса сравниваются одинаково.
Чтобы сравнить фактические строки, используйте strcmp()
или аналогичные.
Вы не должны использовать оператор '==' для сравнения с char *
вместо этого вы должны использовать функцию strcmp в библиотеке cstring
for(int i = 0; i < color_names_SIZE; ++i) {
if(strcmp(color,color_names[i]) == 0) {
cout << "FOUND IT" << endl;
break;
}
}
Ваши сравнительные адреса памяти (в указателях) вместо строк (нулевые завершаемые последовательности символов) здесь:
if(color == *(color_names + i)) {
std::strcmp
этого вам нужно использовать std::strcmp
:
if(std::strcmp(color, *(color_names + i)) == 0) {
Если вам не нужны причины для обучения, гораздо проще использовать оператор индекса, чем использовать арифметику указателя.
Кроме того, c_str() определенно завершено нулем.
Перепишите часть кода, где вы (предположительно) сравниваете строки.
И не сомневайтесь, c_str() и char * оба завершены с нулевым значением.
Вы сравниваете указатели, а не строки. Простое исправление - изменить
const char *color_names[] = {"yellow", "green", "red"};
в
std::string color_names[] = {"yellow", "green", "red"};
Старайтесь не использовать указатели в любом месте, они только вызывают проблемы, особенно когда вы учитесь. У вас достаточно, чтобы учиться, не добавляя всех сложностей указателей.