Trabalhando com Texto e Manipulação de Cadeias de Caracteres
Strings (cadeias de caracteres) são uma das estruturas de dados mais importantes em programação. Em C, strings são arrays de caracteres terminados com o caractere nulo \\\\0. Vamos explorar como declarar, manipular e trabalhar com texto em C.
🧩 1. O que são Strings em C?
Definição:
- Strings são arrays de caracteres (
char) - Terminam com o caractere especial
\\\\0(null character) - Cada caractere ocupa 1 byte na memória
Analogia:
Pense em uma string como um trem de caracteres:
- Cada vagão é um caractere
- O último vagão é sempre o
\\\\0(indicando o fim da string)
⚙️ 2. Declaração e Inicialização de Strings
2.1 Declaração Básica
#include <stdio.h>
int main() {
// Diferentes formas de declarar strings
char nome1[20]; // String vazia com 20 caracteres
char nome2[] = "Maria"; // Tamanho automático (6 caracteres: M-a-r-i-a-\\\\0)
char nome3[10] = "João"; // Tamanho fixo com inicialização
char letra = 'A'; // Caractere único (NÃO é string!)
return 0;
}
2.2 Inicialização com Diferentes Sintaxes
#include <stdio.h>
int main() {
// Método 1: Inicialização direta
char saudacao[] = "Olá, mundo!";
// Método 2: Array de caracteres
char nome[] = {'J', 'o', 'ã', 'o', '\\\\0'};
// Método 3: Atribuição posterior
char cidade[20];
// cidade = "São Paulo"; // ERRADO! Não pode atribuir diretamente
printf("Saudação: %s\\\\n", saudacao);
printf("Nome: %s\\\\n", nome);
return 0;
}
🔍 3. Entrada e Saída de Strings
3.1 Usando printf() e scanf()
#include <stdio.h>
int main() {
char nome[50];
char sobrenome[50];
// Entrada de string sem espaços
printf("Digite seu nome (sem espaços): ");
scanf("%s", nome); // Não usa & porque nome já é um endereço
// Entrada de string com espaços
printf("Digite seu nome completo: ");
scanf(" %[^\\\\n]", sobrenome); // Lê até encontrar nova linha
printf("Nome: %s\\\\n", nome);
printf("Nome completo: %s\\\\n", sobrenome);
return 0;
}
3.2 Usando gets() e fgets() (Recomendado)
#include <stdio.h>
int main() {
char frase[100];
// Método seguro com fgets()
printf("Digite uma frase: ");
fgets(frase, 100, stdin); // Lê no máximo 99 caracteres
printf("Frase digitada: %s", frase);
return 0;
}
🔧 4. Funções de Manipulação de Strings (string.h)
4.1 Incluindo a Biblioteca
#include <stdio.h>
#include <string.h> // Biblioteca para funções de string
int main() {
char str1[20] = "Hello";
char str2[20] = "World";
char str3[20];
return 0;
}
4.2 Funções Principais
#include <stdio.h>
#include <string.h>
int main() {
char str1[20] = "Hello";
char str2[20] = "World";
char str3[20];
int comprimento, resultado;
// strlen() - Comprimento da string
comprimento = strlen(str1);
printf("Comprimento de '%s': %d\\\\n", str1, comprimento);
// strcpy() - Copiar string
strcpy(str3, str1);
printf("str3 após cópia: %s\\\\n", str3);
// strcat() - Concatenar strings
strcat(str1, " ");
strcat(str1, str2);
printf("Após concatenação: %s\\\\n", str1);
// strcmp() - Comparar strings
resultado = strcmp("abc", "abc");
printf("Comparação 'abc' com 'abc': %d\\\\n", resultado); // 0 (iguais)
resultado = strcmp("abc", "abd");
printf("Comparação 'abc' com 'abd': %d\\\\n", resultado); // -1 (diferentes)
return 0;
}
🎯 5. Exemplos Práticos Completos
Exemplo 1: Verificador de Palíndromo
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main() {
char texto[100], texto_limpo[100];
int i, j, tamanho, eh_palindromo = 1;
printf("Digite uma palavra ou frase: ");
fgets(texto, 100, stdin);
// Remover espaços e pontuação, converter para minúsculas
j = 0;
for (i = 0; texto[i] != '\\\\0'; i++) {
if (isalpha(texto[i])) { // Se é letra
texto_limpo[j] = tolower(texto[i]);
j++;
}
}
texto_limpo[j] = '\\\\0';
// Verificar se é palíndromo
tamanho = strlen(texto_limpo);
for (i = 0; i < tamanho / 2; i++) {
if (texto_limpo[i] != texto_limpo[tamanho - 1 - i]) {
eh_palindromo = 0;
break;
}
}
if (eh_palindromo) {
printf("'%s' é um palíndromo!\\\\n", texto_limpo);
} else {
printf("'%s' não é um palíndromo.\\\\n", texto_limpo);
}
return 0;
}
Exemplo 2: Contador de Palavras
#include <stdio.h>
#include <ctype.h>
int main() {
char texto[200];
int i, contador_palavras = 0, dentro_palavra = 0;
printf("Digite um texto: ");
fgets(texto, 200, stdin);
for (i = 0; texto[i] != '\\\\0'; i++) {
if (isalpha(texto[i])) { // Se é letra
if (!dentro_palavra) {
contador_palavras++;
dentro_palavra = 1;
}
} else {
dentro_palavra = 0;
}
}
printf("Número de palavras: %d\\\\n", contador_palavras);
return 0;
}
Exemplo 3: Sistema de Login Simples
#include <stdio.h>
#include <string.h>
#define MAX_USUARIOS 3
#define TAM_SENHA 20
int main() {
char usuarios[MAX_USUARIOS][50] = {"aluno1", "aluno2", "professor"};
char senhas[MAX_USUARIOS][TAM_SENHA] = {"123", "456", "789"};
char usuario[50], senha[TAM_SENHA];
int i, login_sucesso = 0;
printf("=== SISTEMA DE LOGIN ===\\\\n");
printf("Usuário: ");
scanf("%s", usuario);
printf("Senha: ");
scanf("%s", senha);
// Verificar credenciais
for (i = 0; i < MAX_USUARIOS; i++) {
if (strcmp(usuario, usuarios[i]) == 0 && strcmp(senha, senhas[i]) == 0) {
login_sucesso = 1;
break;
}
}
if (login_sucesso) {
printf("Login bem-sucedido! Bem-vindo, %s!\\\\n", usuario);
} else {
printf("Usuário ou senha incorretos!\\\\n");
}
return 0;
}
🔧 6. Manipulação Avançada de Strings
6.1 Conversão de Case
#include <stdio.h>
#include <ctype.h>
void para_maiusculas(char *str) {
int i;
for (i = 0; str[i] != '\\\\0'; i++) {
str[i] = toupper(str[i]);
}
}
void para_minusculas(char *str) {
int i;
for (i = 0; str[i] != '\\\\0'; i++) {
str[i] = tolower(str[i]);
}
}
int main() {
char texto[100] = "Hello World 123!";
printf("Original: %s\\\\n", texto);
para_maiusculas(texto);
printf("Maiúsculas: %s\\\\n", texto);
para_minusculas(texto);
printf("Minúsculas: %s\\\\n", texto);
return 0;
}
6.2 Busca em Strings
#include <stdio.h>
#include <string.h>
int main() {
char texto[100] = "Programação em C é divertido!";
char busca[20];
char *resultado;
printf("Texto: %s\\\\n", texto);
printf("Digite uma palavra para buscar: ");
scanf("%s", busca);
resultado = strstr(texto, busca);
if (resultado != NULL) {
printf("'%s' encontrado na posição %ld\\\\n", busca, resultado - texto);
} else {
printf("'%s' não encontrado!\\\\n", busca);
}
return 0;
}
⚠️ 7. Cuidados Importantes com Strings
7.1 Buffer Overflow
#include <stdio.h>
int main() {
char nome[5]; // Apenas 4 caracteres + \\\\0
// PERIGO: Pode causar overflow!
// printf("Digite seu nome: ");
// scanf("%s", nome); // Se digitar mais de 4 caracteres
// SEGURO:
printf("Digite seu nome (max 4 letras): ");
scanf("%4s", nome); // Limita a 4 caracteres
printf("Nome: %s\\\\n", nome);
return 0;
}
7.2 Comparação Correta
#include <stdio.h>
#include <string.h>
int main() {
char senha[20] = "secreta";
char tentativa[20];
printf("Digite a senha: ");
scanf("%s", tentativa);
// ERRADO: if (tentativa == senha)
// CORRETO:
if (strcmp(tentativa, senha) == 0) {
printf("Senha correta!\\\\n");
} else {
printf("Senha incorreta!\\\\n");
}
return 0;
}
📊 8. Arrays de Strings (Matriz de Caracteres)
8.1 Lista de Nomes
#include <stdio.h>
#include <string.h>
#define MAX_NOMES 5
#define TAM_NOME 50
int main() {
char nomes[MAX_NOMES][TAM_NOME] = {
"Ana Silva",
"Carlos Santos",
"Maria Oliveira",
"João Pereira",
"Julia Rodrigues"
};
int i;
printf("=== LISTA DE NOMES ===\\\\n");
for (i = 0; i < MAX_NOMES; i++) {
printf("%d. %s\\\\n", i + 1, nomes[i]);
}
// Buscar um nome
char busca[TAM_NOME];
printf("\\\\nDigite um nome para buscar: ");
scanf(" %[^\\\\n]", busca);
int encontrado = 0;
for (i = 0; i < MAX_NOMES; i++) {
if (strstr(nomes[i], busca) != NULL) {
printf("Encontrado: %s\\\\n", nomes[i]);
encontrado = 1;
}
}
if (!encontrado) {
printf("Nome não encontrado!\\\\n");
}
return 0;
}
🏆 9. Exercícios Práticos
Exercício 1: Conversor de Formatação
// Crie um programa que converte:
// - Primeira letra de cada palavra para maiúscula
// - Remove espaços extras
// - Formata datas (dd/mm/aaaa para aaaa-mm-dd)
Exercício 2: Analisador de Texto
// Crie um programa que analisa um texto e mostra:
// - Número de caracteres, palavras e linhas
// - Palavra mais longa e mais curta
// - Frequência de cada letra
Exercício 3: Cifra de César
// Implemente uma cifra de César que codifica/decodifica
// textos deslocando cada letra por N posições no alfabeto
📌 Resumo do que Aprendemos:
✅ O que são strings em C e sua estrutura
✅ Declaração e inicialização de strings
✅ Entrada e saída segura de strings
✅ Funções da biblioteca string.h
✅ Manipulação avançada: busca, conversão, formatação
✅ Arrays de strings (matrizes de caracteres)
✅ Cuidados importantes com segurança e comparação
🚀 Próxima Aula: STRUCTS em C!
Aprenderemos a criar nossos próprios tipos de dados com estruturas!
Comentem suas dúvidas e compartilhem suas soluções para os exercícios!
💻 Dica Extra: Pratique criando programas que manipulam texto, como formatadores de documento, analisadores de log, ou sistemas de processamento de dados textuais.

