Usando strcmp()
Parte da seção Logic & Flow do Journey de C da Coddy — lição 18 de 63.
Você aprendeu como juntar strings com strcat(), mas e se você precisar determinar se duas strings contêm exatamente o mesmo texto? Em C, você não pode usar o operador de igualdade (==) para comparar strings porque ele apenas compara endereços de memória, não o conteúdo real.
A função strcmp() da biblioteca <string.h> resolve esse problema comparando duas strings caractere por caractere. Ela realiza o que é chamado de comparação lexicográfica - essencialmente comparando strings em ordem de dicionário.
#include <stdio.h>
#include <string.h>
char word1[] = "apple";
char word2[] = "apple";
int result = strcmp(word1, word2); // Retorna 0 (as strings são iguais)A função strcmp() retorna três tipos diferentes de valores: ela retorna 0 se as strings forem idênticas, um valor negativo se a primeira string vier antes da segunda em ordem alfabética, e um valor positivo se a primeira string vier depois da segunda em ordem alfabética.
Esta função é essencial para tomar decisões com base no conteúdo de strings, como validar a entrada do usuário, ordenar dados de texto ou implementar a funcionalidade de busca em seus programas.
Desafio
FácilEscreva um programa em C que implemente um sistema simples de verificação de senha usando a função strcmp(). Seu programa deve:
- Ler um número inteiro
nrepresentando o número de tentativas de login a serem processadas - Para cada tentativa de login:
- Ler um nome de usuário da entrada
- Ler uma senha da entrada
- Usar
strcmp()para comparar o nome de usuário com "admin" - Usar
strcmp()para comparar a senha com "secret123" - Imprimir a mensagem apropriada com base nos resultados da comparação
- Após processar todas as tentativas, contar e exibir quantos logins bem-sucedidos ocorreram
A lógica de validação de login deve ser:
- Se tanto o nome de usuário quanto a senha estiverem corretos: imprimir "Login successful"
- Se o nome de usuário estiver correto, mas a senha estiver errada: imprimir "Invalid password"
- Se o nome de usuário estiver errado, mas a senha estiver correta: imprimir "Invalid username"
- Se tanto o nome de usuário quanto a senha estiverem errados: imprimir "Invalid credentials"
Lembre-se de incluir o cabeçalho <string.h> para usar a função strcmp().
Sua saída deve exibir os resultados no seguinte formato:
[Login result message]
[Login result message]
...
Total successful logins: [count]Por exemplo, se a entrada for:
4
admin
secret123
user
password
admin
wrong
guest
secret123Sua saída deve ser:
Login successful
Invalid credentials
Invalid password
Invalid username
Total successful logins: 1Este desafio testa sua compreensão do uso de strcmp() para comparar strings quanto à igualdade, implementando lógica condicional baseada em resultados de comparação de strings e contando ocorrências com base nos resultados da comparação.
Folha de consulta
A função strcmp() de <string.h> compara duas strings caractere por caractere usando comparação lexicográfica:
#include <string.h>
char word1[] = "apple";
char word2[] = "apple";
int result = strcmp(word1, word2);strcmp() retorna:
0se as strings forem idênticas- Valor negativo se a primeira string vier antes da segunda em ordem alfabética
- Valor positivo se a primeira string vier depois da segunda em ordem alfabética
Não é possível usar == para comparar strings em C, pois ele compara apenas endereços de memória, não o conteúdo.
Experimente você mesmo
#include <stdio.h>
#include <string.h>
int main() {
int n;
scanf("%d", &n);
char username[100];
char password[100];
int successful_logins = 0;
// TODO: Escreva seu código aqui
// Processe cada tentativa de login usando a função strcmp()
// Compare o nome de usuário com "admin" e a senha com "secret123"
// Imprima as mensagens apropriadas e conte os logins bem-sucedidos
printf("Total successful logins: %d\n", successful_logins);
return 0;
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Logic & Flow
1Fundamentos de Ponteiros
O que é um Ponteiro?Declarando PonteirosO Operador de Endereço (&)O Operador de Desreferência (*)Ponteiros NULLRecapitulação: Fundamentos de Ponteiros4Projeto: Utilitário de Texto Simples
Visão Geral do ProjetoContando Caracteres2Ponteiros e Arrays
Nomes de Arrays como PonteirosElementos de Array - PonteirosAritmética de PonteirosComparando PonteirosRecapitulação: Percorrendo Arrays com Ponteiros5Ponteiros e Funções
Passagem por ValorPassando Ponteiros para FunçõesModificando Variáveis via PonteirosUm Exemplo Clássico: SwapPassando Arrays para FunçõesRecapitulação: Ponteiros como Argumentos3Arrays de Caracteres e Strings
Strings como Arrays de charO Terminador NuloEntrada de Strings com scanfUsando strlen()Usando strcpy()Usando strcat()Usando strcmp()Recapitulação: Funções Básicas de Strings6Gerenciamento de Memória
Memória Stack vs. HeapAlocação Dinâmica - malloc()Usando sizeof() para AlocaçãoVerificando Falhas de AlocaçãoLiberando Memória com free()Alocando com calloc()Recapitulação: Array Dinâmico9Projeto: Cadastro Simples de Contatos
Projeto: Definir a Struct de ContatoFunção para Criar um Contato