Сравнение символьных массивов и строковых литералов в C ++

StackOverflow https://stackoverflow.com/questions/1639411

Вопрос

У меня есть массив символов, и я пытаюсь выяснить, соответствует ли он строковому литералу, например:

char value[] = "yes";
if(value == "yes") {
   // code block
} else {
   // code block
}

Это привело к следующей ошибке:сравнение со строковым литералом приводит к неопределенному поведению.Я также попробовал что-то вроде:

char value[] = "yes";
if(strcmp(value, "yes")) {
   // code block
} else {
   // code block
}

Это не привело к каким-либо ошибкам компилятора, но ведет себя не так, как ожидалось.

Это было полезно?

Решение

std::strcmp возвращает 0, если строки равны.

Другие советы

Проверьте документацию на strcmp. Подсказка: он не возвращает логическое значение.

ETA: == вообще не работает, потому что cstr1 == cstr2 сравнивает указатели , поэтому сравнение будет истинным, только если cstr1 и cstr2 указывают на одну и ту же ячейку памяти, даже если они оба относятся к строкам, которые лексикографически равны. То, что вы пробовали (сравнение строки с литералом, например cstr == "yes") особенно , не сработает, потому что стандарт не требует этого. В разумной реализации я сомневаюсь, что это взорвется, но cstr вряд ли когда-нибудь удастся, потому что "yes" вряд ли будет ссылаться на адрес, в котором находится строковая константа <=>.

strcmp возвращает значение трех состояний, указывающее, каков относительный порядок двух строк.При выполнении вызова типа strcmp(a, b) функция возвращает

  • значение < 0 , когда a < b
  • 0, когда a == b
  • значение > 0, когда a > b
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top