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

Почему используется 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());

0

Решение

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

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

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

5

Другие решения

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

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

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

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

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

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

3

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

вместо этого вы должны использовать функцию 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

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

И не сомневайтесь, что c_str () и char * обнуляются.

0

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

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

в

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

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

0
По вопросам рекламы [email protected]