Сравнение символьных массивов и строковых литералов в C ++
-
08-07-2019 - |
Вопрос
У меня есть массив символов, и я пытаюсь выяснить, соответствует ли он строковому литералу, например:
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