Как проверить, соответствует ли значение строке

У меня есть структура с чем-то вроде:

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".