Лучший способ сравнить строки в C - использовать strcmp()
(или strncmp()
, если кто-то заинтересован в безопасности с неизвестными строками).
Оператор равенства ==
сравнивает операнды напрямую после того, как они "распадаются" до указателей; указатели не меняются и, конечно, отличаются. strcmp()
, напротив, проверяет содержимое памяти, на которую указывает , , которая может быть равна.
Кроме того, такая же проблема существует в Java: ==
проверяет, являются ли обе стороны одинаковыми объектами , аналогично эквиваленту C, в то время как .equals()
проверяет объект содержимое , аналогично strcmp()
.
C # , напротив, перегружен ==
для строк, чтобы он действительно смотрел на содержимое, что имеет большой смысл для языка, где возможна перегрузка операторов (а C - нет) : Проверка идентичности объектов почти никогда не требуется и, как мы видим, является распространенным источником ошибок.