Создание функций сравнения строк на языке C

CBeginner
Практиковаться сейчас

Введение

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

Понимание функции strcmp()

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

  1. Создайте новый файл с именем string-compare.c в директории ~/project:
cd ~/project
touch string-compare.c
  1. Откройте файл в WebIDE и добавьте следующий код:
#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "hello";
    char str2[] = "hello";
    char str3[] = "world";

    // Compare strings using strcmp()
    int result1 = strcmp(str1, str2);
    int result2 = strcmp(str1, str3);

    printf("Comparison between str1 and str2: %d\n", result1);
    printf("Comparison between str1 and str3: %d\n", result2);

    return 0;
}
  1. Скомпилируйте и запустите программу:
gcc string-compare.c -o string-compare
./string-compare

Пример вывода:

Comparison between str1 and str2: 0
Comparison between str1 and str3: -15

Разберём, как работает функция strcmp():

  • Она возвращает 0, если строки полностью совпадают.
  • Она возвращает отрицательное значение, если первая строка лексикографически меньше второй.
  • Она возвращает положительное значение, если первая строка лексикографически больше второй.

Функция сравнивает строки посимвольно, пока не найдёт различие или не дойдёт до конца одной из строк.

Реализация сравнения строк с использованием if-else

В этом шаге вы научитесь использовать функцию strcmp() вместе с условными операторами для принятия решений на основе сравнения строк.

  1. Создайте новый файл с именем string-compare-conditional.c в директории ~/project:
cd ~/project
touch string-compare-conditional.c
  1. Откройте файл в WebIDE и добавьте следующий код:
#include <stdio.h>
#include <string.h>

int main() {
    char username[50];
    char password[50];

    printf("Enter username: ");
    scanf("%s", username);

    printf("Enter password: ");
    scanf("%s", password);

    // Compare username and password using if-else
    if (strcmp(username, "admin") == 0) {
        if (strcmp(password, "secret") == 0) {
            printf("Login successful!\n");
        } else {
            printf("Incorrect password.\n");
        }
    } else {
        printf("Invalid username.\n");
    }

    return 0;
}
  1. Скомпилируйте и запустите программу:
gcc string-compare-conditional.c -o string-compare-conditional
./string-compare-conditional

Пример взаимодействия:

Enter username: admin
Enter password: secret
Login successful!

Enter username: user
Enter password: wrongpass
Invalid username.

Основные моменты этого примера:

  • Функция strcmp() используется внутри операторов if для проверки равенства строк.
  • Функция возвращает 0, когда строки полностью совпадают.
  • Вложенные операторы if-else позволяют реализовать сложную логику сравнения строк.

Обработка нечувствительного к регистру сравнения

В этом шаге вы научитесь выполнять нечувствительное к регистру сравнение строк с использованием функции strcasecmp().

  1. Создайте новый файл с именем case-insensitive-compare.c в директории ~/project:
cd ~/project
touch case-insensitive-compare.c
  1. Откройте файл в WebIDE и добавьте следующий код:
#include <stdio.h>
#include <string.h>

int main() {
    char input[50];

    printf("Enter a color (Red/red/GREEN/green): ");
    scanf("%s", input);

    // Case-insensitive comparison
    if (strcasecmp(input, "red") == 0) {
        printf("You entered the color RED.\n");
    } else if (strcasecmp(input, "green") == 0) {
        printf("You entered the color GREEN.\n");
    } else if (strcasecmp(input, "blue") == 0) {
        printf("You entered the color BLUE.\n");
    } else {
        printf("Unknown color.\n");
    }

    return 0;
}
  1. Скомпилируйте программу (замечание: вам может потребоваться использовать флаг -std=gnu99):
gcc case-insensitive-compare.c -o case-insensitive-compare
  1. Запустите программу:
./case-insensitive-compare

Примеры взаимодействия:

Enter a color (Red/red/GREEN/green): RED
You entered the color RED.

Enter a color (Red/red/GREEN/green): green
You entered the color GREEN.

Основные моменты нечувствительного к регистру сравнения:

  • Функция strcasecmp() сравнивает строки, игнорируя различия в регистре букв.
  • Она работает аналогично функции strcmp(), но нечувствительна к регистру.
  • Полезна для обработки пользовательского ввода, когда регистр букв не имеет значения.

Выполнение множественных сравнений строк

В этом шаге вы научитесь выполнять множественные сравнения строк с использованием различных техник сравнения.

  1. Создайте новый файл с именем multiple-string-compare.c в директории ~/project:
cd ~/project
touch multiple-string-compare.c
  1. Откройте файл в WebIDE и добавьте следующий код:
#include <stdio.h>
#include <string.h>

int main() {
    char input[3][50];
    int comparison_count = 0;

    // Input three strings
    for (int i = 0; i < 3; i++) {
        printf("Enter string %d: ", i + 1);
        scanf("%s", input[i]);
    }

    // Compare first two strings
    if (strcmp(input[0], input[1]) == 0) {
        printf("First two strings are identical.\n");
        comparison_count++;
    }

    // Compare last two strings
    if (strcmp(input[1], input[2]) == 0) {
        printf("Last two strings are identical.\n");
        comparison_count++;
    }

    // Compare first and last strings
    if (strcmp(input[0], input[2]) == 0) {
        printf("First and last strings are identical.\n");
        comparison_count++;
    }

    // Overall comparison summary
    printf("Total matching string pairs: %d\n", comparison_count);

    return 0;
}
  1. Скомпилируйте программу:
gcc multiple-string-compare.c -o multiple-string-compare
  1. Запустите программу:
./multiple-string-compare

Примеры взаимодействия:

Enter string 1: hello
Enter string 2: world
Enter string 3: hello
Total matching string pairs: 1

Основные моменты множественных сравнений строк:

  • Используйте функцию strcmp() для сравнения различных комбинаций строк.
  • Отслеживайте количество совпадающих пар строк.
  • Демонстрируйте гибкую логику сравнения строк.

Применение сравнения строк в реальной ситуации

В этом шаге вы создадите простую систему управления паролями, которая демонстрирует практические техники сравнения строк.

  1. Создайте новый файл с именем password-manager.c в директории ~/project:
cd ~/project
touch password-manager.c
  1. Откройте файл в WebIDE и добавьте следующий код:
#include <stdio.h>
#include <string.h>

#define MAX_USERS 3
#define MAX_USERNAME 50
#define MAX_PASSWORD 50

// User structure to store credentials
struct User {
    char username[MAX_USERNAME];
    char password[MAX_PASSWORD];
    char role[20];
};

int main() {
    // Predefined user database
    struct User users[MAX_USERS] = {
        {"admin", "admin123", "administrator"},
        {"manager", "manager456", "manager"},
        {"user", "user789", "regular"}
    };

    char input_username[MAX_USERNAME];
    char input_password[MAX_PASSWORD];
    int login_success = 0;

    printf("=== Simple Password Management System ===\n");
    printf("Enter username: ");
    scanf("%s", input_username);

    printf("Enter password: ");
    scanf("%s", input_password);

    // Authenticate user with string comparison
    for (int i = 0; i < MAX_USERS; i++) {
        if (strcmp(users[i].username, input_username) == 0) {
            if (strcmp(users[i].password, input_password) == 0) {
                printf("Login Successful!\n");
                printf("Role: %s\n", users[i].role);
                login_success = 1;
                break;
            }
        }
    }

    if (!login_success) {
        printf("Login Failed. Invalid username or password.\n");
    }

    return 0;
}
  1. Скомпилируйте программу:
gcc password-manager.c -o password-manager
  1. Запустите программу:
./password-manager

Примеры взаимодействия:

=== Simple Password Management System ===
Enter username: admin
Enter password: admin123
Login Successful!
Role: administrator

Enter username: user
Enter password: wrongpassword
Login Failed. Invalid username or password.

Основные моменты этой реальной ситуации:

  • Использует функцию strcmp() для безопасной проверки учетных данных.
  • Демонстрирует практическое применение сравнения строк.
  • Реализует простую систему аутентификации.
  • Показывает, как сравнивать учетные данные нескольких пользователей.

Резюме

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

Основные моменты обучения из этого практического занятия включают понимание функции strcmp(), реализацию сравнения строк с использованием операторов if-else, обработку нечувствительного к регистру сравнения и применение сравнения строк в практическом приложении.