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.


Descubra mais sobre Apprendendo

Assine agora mesmo para continuar lendo e ter acesso ao arquivo completo.

Continue lendo