Использование strcmp()
Часть раздела Logic & Flow путешествия по C на Coddy — урок 18 из 63.
Вы узнали, как объединять строки с помощью strcat(), но что если вам нужно определить, содержат ли две строки абсолютно одинаковый текст? В языке C вы не можете использовать оператор равенства (==) для сравнения строк, так как он сравнивает только адреса в памяти, а не само содержимое.
Функция strcmp() из библиотеки <string.h> решает эту проблему, сравнивая две строки посимвольно. Она выполняет так называемое лексикографическое сравнение — по сути, сравнение строк в словарном порядке.
#include <stdio.h>
#include <string.h>
char word1[] = "apple";
char word2[] = "apple";
int result = strcmp(word1, word2); // Возвращает 0 (строки равны)Функция strcmp() возвращает три различных типа значений: она возвращает 0, если строки идентичны, отрицательное значение, если первая строка идет перед второй в алфавитном порядке, и положительное значение, если первая строка идет после второй в алфавитном порядке.
Эта функция необходима для принятия решений на основе содержимого строк, таких как валидация пользовательского ввода, сортировка текстовых данных или реализация функционала поиска в ваших программах.
Задание
ЛегкоНапишите программу на языке C, которая реализует простую систему проверки пароля с использованием функции strcmp(). Ваша программа должна:
- Считать целое число
n, представляющее количество попыток входа для обработки - Для каждой попытки входа:
- Считать имя пользователя (username) из входных данных
- Считать пароль (password) из входных данных
- Использовать
strcmp()для сравнения имени пользователя с "admin" - Использовать
strcmp()для сравнения пароля с "secret123" - Вывести соответствующее сообщение на основе результатов сравнения
- После обработки всех попыток подсчитать и вывести количество успешных входов
Логика проверки входа должна быть следующей:
- Если и имя пользователя, и пароль верны: вывести "Login successful"
- Если имя пользователя верно, но пароль неверный: вывести "Invalid password"
- Если имя пользователя неверно, но пароль верный: вывести "Invalid username"
- Если и имя пользователя, и пароль неверны: вывести "Invalid credentials"
Не забудьте включить заголовочный файл <string.h> для использования функции strcmp().
Ваш вывод должен отображать результаты в следующем формате:
[Login result message]
[Login result message]
...
Total successful logins: [count]Например, если входные данные следующие:
4
admin
secret123
user
password
admin
wrong
guest
secret123Ваш вывод должен быть таким:
Login successful
Invalid credentials
Invalid password
Invalid username
Total successful logins: 1Эта задача проверяет ваше понимание использования strcmp() для сравнения строк на равенство, реализации условной логики на основе результатов сравнения строк и подсчета вхождений на основе результатов сравнения.
Шпаргалка
Функция strcmp() из <string.h> сравнивает две строки посимвольно, используя лексикографическое сравнение:
#include <string.h>
char word1[] = "apple";
char word2[] = "apple";
int result = strcmp(word1, word2);strcmp() возвращает:
0, если строки идентичны- Отрицательное значение, если первая строка идет перед второй в алфавитном порядке
- Положительное значение, если первая строка идет после второй в алфавитном порядке
Нельзя использовать == для сравнения строк в C, так как этот оператор сравнивает только адреса памяти, а не содержимое.
Попробуйте сами
#include <stdio.h>
#include <string.h>
int main() {
int n;
scanf("%d", &n);
char username[100];
char password[100];
int successful_logins = 0;
// TODO: Напишите ваш код здесь
// Обработайте каждую попытку входа, используя функцию strcmp()
// Сравните имя пользователя с "admin" и пароль с "secret123"
// Выведите соответствующие сообщения и подсчитайте количество успешных входов
printf("Total successful logins: %d\n", successful_logins);
return 0;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функции