Criar Funções de Comparação de Strings em C

CBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como criar e implementar funções de comparação de strings personalizadas em C. O laboratório aborda a compreensão da função strcmp() integrada, a implementação da comparação de strings usando instruções condicionais, o tratamento de comparações que não diferenciam maiúsculas e minúsculas, a execução de múltiplas comparações de strings e a aplicação da comparação de strings em um cenário do mundo real. Ao final deste laboratório, você terá uma forte compreensão das técnicas de manipulação e comparação de strings na programação em C.

Entenda a Função strcmp()

Nesta etapa, você aprenderá sobre a função strcmp() em C, que é usada para comparar duas strings lexicograficamente.

  1. Crie um novo arquivo chamado string-compare.c no diretório ~/project:
cd ~/project
touch string-compare.c
  1. Abra o arquivo no WebIDE e adicione o seguinte código:
#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. Compile e execute o programa:
gcc string-compare.c -o string-compare
./string-compare

Exemplo de saída:

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

Vamos detalhar como strcmp() funciona:

  • Retorna 0 se as strings são exatamente iguais
  • Retorna um valor negativo se a primeira string é lexicograficamente menor que a segunda
  • Retorna um valor positivo se a primeira string é lexicograficamente maior que a segunda

A função compara as strings caractere por caractere até encontrar uma diferença ou atingir o final de uma das strings.

Implementar Comparação de Strings com if-else

Nesta etapa, você aprenderá como usar strcmp() com instruções condicionais para tomar decisões com base em comparações de strings.

  1. Crie um novo arquivo chamado string-compare-conditional.c no diretório ~/project:
cd ~/project
touch string-compare-conditional.c
  1. Abra o arquivo no WebIDE e adicione o seguinte código:
#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. Compile e execute o programa:
gcc string-compare-conditional.c -o string-compare-conditional
./string-compare-conditional

Exemplo de interação:

Enter username: admin
Enter password: secret
Login successful!

Enter username: user
Enter password: wrongpass
Invalid username.

Pontos-chave sobre este exemplo:

  • strcmp() é usado dentro de instruções if para verificar a igualdade de strings
  • A função retorna 0 quando as strings correspondem exatamente
  • Instruções if-else aninhadas permitem uma lógica de comparação de strings complexa

Lidar com Comparação Case-insensitive

Nesta etapa, você aprenderá como realizar comparações de strings sem distinção entre maiúsculas e minúsculas usando a função strcasecmp().

  1. Crie um novo arquivo chamado case-insensitive-compare.c no diretório ~/project:
cd ~/project
touch case-insensitive-compare.c
  1. Abra o arquivo no WebIDE e adicione o seguinte código:
#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. Compile o programa (nota: pode ser necessário usar a flag -std=gnu99):
gcc case-insensitive-compare.c -o case-insensitive-compare
  1. Execute o programa:
./case-insensitive-compare

Exemplos de interações:

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.

Pontos-chave sobre a comparação sem distinção de maiúsculas e minúsculas:

  • strcasecmp() compara strings ignorando diferenças de maiúsculas e minúsculas
  • Funciona de forma semelhante a strcmp(), mas não diferencia maiúsculas e minúsculas
  • Útil para entradas do usuário onde a capitalização não deve importar

Realizar Múltiplas Comparações de Strings

Nesta etapa, você aprenderá como realizar múltiplas comparações de strings usando diferentes técnicas de comparação.

  1. Crie um novo arquivo chamado multiple-string-compare.c no diretório ~/project:
cd ~/project
touch multiple-string-compare.c
  1. Abra o arquivo no WebIDE e adicione o seguinte código:
#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. Compile o programa:
gcc multiple-string-compare.c -o multiple-string-compare
  1. Execute o programa:
./multiple-string-compare

Exemplo de interações:

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

Pontos-chave sobre múltiplas comparações de strings:

  • Use strcmp() para comparar diferentes combinações de strings
  • Acompanhe o número de pares de strings correspondentes
  • Demonstre lógica flexível de comparação de strings

Aplicar Comparação de Strings em um Cenário Real

Nesta etapa, você criará um sistema simples de gerenciamento de senhas que demonstra técnicas práticas de comparação de strings.

  1. Crie um novo arquivo chamado password-manager.c no diretório ~/project:
cd ~/project
touch password-manager.c
  1. Abra o arquivo no WebIDE e adicione o seguinte código:
#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. Compile o programa:
gcc password-manager.c -o password-manager
  1. Execute o programa:
./password-manager

Exemplos de interações:

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

Pontos-chave sobre este cenário do mundo real:

  • Usa strcmp() para verificação segura de credenciais
  • Demonstra a aplicação prática da comparação de strings
  • Implementa um sistema simples de autenticação
  • Mostra como comparar múltiplas credenciais de usuário

Resumo

Neste laboratório, você aprendeu sobre a função strcmp() em C, que é usada para comparar duas strings lexicograficamente. Você implementou a comparação de strings usando strcmp() e instruções condicionais para tomar decisões com base nos resultados da comparação. Você também aprendeu como lidar com a comparação sem distinção entre maiúsculas e minúsculas e realizar múltiplas comparações de strings. Finalmente, você aplicou a comparação de strings em um cenário do mundo real envolvendo autenticação de usuário.

Os principais pontos de aprendizado deste laboratório incluem a compreensão da função strcmp(), a implementação da comparação de strings com instruções if-else, o tratamento da comparação sem distinção entre maiúsculas e minúsculas e a aplicação da comparação de strings em uma aplicação prática.