Как проверить, соответствует ли значение строке
У меня есть структура с чем-то вроде:
char *sname;
........
players[i].sname
равняется "Джеймсу".
Мне нужно проверить на равенство между значениями, например, так:
if (players[i].sname == 'Lee')
но мне не очень повезло. Есть ли функция str*
я должен использовать, или в любом случае исправить мое выражение if
?
Ответы
Ответ 1
Короткий ответ: strcmp()
.
Длинный ответ: Итак, у вас есть это:
if(players[i].sname == 'Lee')
Это неверно в нескольких отношениях. Во-первых, одиночные кавычки означают "символьный литерал", а не "строковый литерал" в C.
Во-вторых, и что более важно, "string1" == "string2"
не сравнивает строки, сравнивает char *
s или указывает на символы. Он скажет вам, сохранены ли две строки в том же месте памяти. Это будет означать, что они равны, но ложный результат не означает, что они неравны.
strcmp()
будет в основном проходить и сравнивать каждый символ в строках, останавливаясь на первом символе, который не равен, и возвращает разницу между двумя символами (поэтому вы должны сказать strcmp() == 0
или !strcmp()
для равенства).
Обратите внимание также на функции strncmp()
и memcmp()
, которые похожи на strcmp()
, но более безопасны.
Ответ 2
Вы должны использовать strcmp()
:
if (strcmp(players[i].sname, "Lee") == 0) { ...
Также обратите внимание, что строки в C окружены двойными кавычками: ""
. Одиночные символы окружены одинарными кавычками: ''
. Я не уверен, что ваш компилятор может делать с 'Lee'
, но это почти наверняка не то, что вы хотите.
Ответ 3
Вы искали strcmp()
из заголовка <string.h>
.
Обратите внимание, что вам нужна строка - 'Lee'
не строка, а многосимвольная константа, которая разрешена, но редко используется, не в последнюю очередь потому, что представление определено компилятором, а не стандартом C.
Если вы хотите сравнить две строки - вызовите указатели на них first
и second
, тогда вы пишете:
if (strcmp(first, second) == 0) // first equal to second
if (strcmp(first, second) <= 0) // first less than or equal to second
if (strcmp(first, second) < 0) // first less than second
if (strcmp(first, second) >= 0) // first greater than or equal to second
if (strcmp(first, second) > 0) // first greater than second
if (strcmp(first, second) != 0) // first unequal to second
Это, на мой взгляд, дает понять, что такое сравнение, и поэтому следует использовать нотацию. Обратите внимание, что strcmp()
может возвращать любое отрицательное значение, чтобы указать "меньше" или любое положительное значение, чтобы указать "больше".
Будьте осторожны при использовании strncmp()
вместо strcmp()
, который был предложен в одном ответе. Если у вас есть:
if (strncmp(first, "command", 7) == 0)
то если first
содержит "commander"
, совпадение будет действительным. Если это не то, что вы хотите, но вы хотите использовать strncmp()
в любом случае, вы должны написать:
if (strncmp(first, "command", sizeof("command")) == 0)
Это правильно отклонит "commander"
.