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