Menu
Coddy logo textTech

Использование 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, если строки идентичны, отрицательное значение, если первая строка идет перед второй в алфавитном порядке, и положительное значение, если первая строка идет после второй в алфавитном порядке.

Эта функция необходима для принятия решений на основе содержимого строк, таких как валидация пользовательского ввода, сортировка текстовых данных или реализация функционала поиска в ваших программах.

challenge icon

Задание

Легко

Напишите программу на языке C, которая реализует простую систему проверки пароля с использованием функции strcmp(). Ваша программа должна:

  1. Считать целое число n, представляющее количество попыток входа для обработки
  2. Для каждой попытки входа:
    • Считать имя пользователя (username) из входных данных
    • Считать пароль (password) из входных данных
    • Использовать strcmp() для сравнения имени пользователя с "admin"
    • Использовать strcmp() для сравнения пароля с "secret123"
    • Вывести соответствующее сообщение на основе результатов сравнения
  3. После обработки всех попыток подсчитать и вывести количество успешных входов

Логика проверки входа должна быть следующей:

  • Если и имя пользователя, и пароль верны: вывести "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;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Logic & Flow