Сравнение строк
Правильный ли пароль ввёл пользователь? (В настоящей программе его вводил бы пользователь. Программы на этом сайте берут данные из переменных.) Первая мысль — сравнить строки через ==. Это скомпилируется, но сделает не то, что вы ожидаете:
char password[] = "sesame";
char attempt[] = "sesame";
if (attempt == password) {
printf("Доступ разрешён\n");
} else {
printf("Доступ запрещён\n");
}Это выведет:
Доступ запрещёнВ обоих массивах один и тот же текст, а программа говорит, что они разные. Дело в том, что == не сравнивает символы двух массивов. Он лишь спрашивает, не один ли это массив, то есть то же ли это место в памяти компьютера. У каждого массива своё место в памяти, поэтому для двух разных массивов ответ всегда «нет». (Clang предупреждает об этом, но этот сайт предупреждения не показывает.)
Чтобы сравнить тексты, используйте функцию strcmp (string compare, «сравнение строк») из string.h. Она идёт по обеим строкам символ за символом и возвращает целое число: 0, когда тексты одинаковы:
char password[] = "sesame";
char attempt[] = "sesame";
if (strcmp(attempt, password) == 0) {
printf("Доступ разрешён\n");
} else {
printf("Доступ запрещён\n");
}Это выведет:
Доступ разрешёнОсторожно: здесь 0 означает «одинаково», а это противоположно тому, чего можно ожидать. В условии 0 — это ложь, поэтому if (strcmp(attempt, password)) означало бы «если тексты разные». Всегда пишите == 0, чтобы код говорил именно то, что делает.
Когда тексты разные, число показывает их порядок по алфавиту. Оно отрицательное, если первый текст идёт раньше второго, и положительное, если после него. Не рассчитывайте на какое-то конкретное число, например -1. Проверяйте только, меньше оно 0 или больше:
char first[] = "apple";
char second[] = "banana";
if (strcmp(first, second) < 0) {
printf("Первым идёт %s\n", first);
} else {
printf("Первым идёт %s\n", second);
}Это выведет:
Первым идёт applestrcmp сравнивает символы как числа: 'A' — это 65, 'B' — 66 и так далее, а строчные буквы начинаются с 'a', то есть с 97. Поэтому заглавные и строчные буквы различаются: strcmp("Sesame", "sesame") не равно 0. И каждая заглавная буква стоит раньше любой строчной, так что для strcmp слово "Zebra" идёт раньше "apple".
Задание
- 1
Попытка верная, но программа выводит
Доступ запрещён. Исправьте условие: сравните тексты с помощьюstrcmpи== 0. Тогда программа выведетДоступ разрешён. - 2
Под условием создайте имена двух игроков,
char player1[] = "Mia";иchar player2[] = "Leo";. С помощьюstrcmpвыведите того, кто идёт первым по алфавиту, в видеПервым идёт Leo.