5950257 - Programação de Computadores
Aula 09 - Strings
Prof. Dr. Denis M. L. Martins
DCM | FFCLRP | USP

top-right

Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Objetivos de Aprendizagem

  • Compreender o conceito de strings em C
  • Declarar e inicializar strings corretamente
  • Utilizar funções básicas para manipulação de strings
  • Percorrer strings utilizando estruturas de repetição
  • Desenvolver algoritmos simples utilizando strings

Para os exercícios desta aula, você pode utilizar IDEs online como:
https://www.onlinegdb.com/online_c_compiler
https://www.programiz.com/c-programming/online-compiler/

Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

O que é uma String?

Uma string é:

  • Uma sequência de caracteres
  • Utilizada para armazenar textos
  • Implementada em C como um vetor de caracteres

Em C, uma string é simplesmente um array de caracteres terminados por \0.

  • O caractere nulo (\0, valor ASCII 0) marca o fim da string. Sem ele, a função printf ou strlen não sabe onde parar.
char nome[] = "Joao";
// Na memória: 'J', 'o', 'a', 'o', '\0' (5 bytes)
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Declaração e Inicialização

Formas de inicializar:

char nome[] = "Carlos";
char nome[10] = "Carlos";
char nome[] = {'C','a','r','l','o','s','\0'};
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Exibindo Strings

#include <stdio.h>

int main() {
    char nome[] = "Ana";
    printf("%s", nome);

    return 0;
}

O especificador %s é utilizado para imprimir strings.

Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Leitura de Strings

Utilizando scanf:

#include <stdio.h>

int main() {
    char nome[20];
    scanf("%s", nome);
    printf("%s", nome);

    return 0;
}
  • Problema: a função scanf não lê espaços.
  • Exemplo de entrada: Maria Silva. Resultado armazenado: Maria.
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Leitura segura de Strings

#include <stdio.h>

int main() {
    char nome[20];
    fgets(nome, 20, stdin);
    printf("%s", nome);
    return 0;
}

fgets lê até o limite ou newline (\n).

  • Mantém o \n na string (precisa remover se quiser).
  • Lê espaços
  • Evita overflow
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Percorrendo Strings

Podemos utilizar um loop for para percorrer strings:

#include <stdio.h>

int main() {

    char texto[] = "Programação";

    for(int i = 0; texto[i] != '\0'; i++) {
        printf("%c\n", texto[i]);
    }

    return 0;
}

%c é utilizado para imprimir caracteres individuais

Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Percorrendo Strings (cont.)

Para percorrer strings utilizando um loop while, podemos utilizar como condição de parada o \0 e, assim, encerrar o loop:

#include <stdio.h>

int main() {
    char texto[] = "Radiacao";
    int contador = 0;

    while(texto[contador] != '\0') {
        contador++;
    }

    printf("Quantidade: %d", contador);

    return 0;
}
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Exercício

Escreva um programa em C que:

  • Leia uma frase qualquer do teclado
  • Conte o número de letras "a" nesta frase
  • Imprima o número de letras "a"
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

A Tabela ASCII

ASCII (American Standard Code for Information Interchange): Padrão para mapear caracteres em valores inteiros decimais.

Exemplos:

  • O caractere 'A' é sempre representada pelo número 65 decimal (ou 01000001 binário).
  • O caractere 'a' é 97.
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Caracteres como int

Em C, um char é um tipo inteiro pequeno (int). Quando você faz aritmética com caracteres, o compilador trata eles como seus valores ASCII subjacentes.

char letra = 'B';
printf("%d", letra); // Imprime: 66
char proximaLetra = letra + 3; 
printf("\nA próxima é %c e tem valor %d)", proximaLetra, proximaLetra); 
// Saída esperada: E (Valor: 69)
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Manipulação de strings com string.h

#include <string.h>

Principais Funções:

  • strlen(s): Retorna o tamanho (sem contar \0).
  • strcpy(dest, src): Copia string. Perigoso se dest for menor que src.
  • strcat(dest, src): Concatena strings. Dest deve ter espaço suficiente.
  • strcmp(a, b): Compara duas strings (retorna 0 se iguais).
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Função strlen

#include <stdio.h>
#include <string.h>

int main() {

    char texto[] = "Tomografia";

    printf("%lu", strlen(texto));

    return 0;
}

Resultado:

10
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Função strcpy

#include <stdio.h>
#include <string.h>

int main() {
    char origem[] = "MRI";
    char destino[20];

    strcpy(destino, origem);
    printf("%s", destino);

    return 0;
}

Resultado:

destino = "MRI"
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Função strcat

char a[30] = "Linguagem ";
char b[] = "C";

strcat(a, b);

Resultado:

"Fisica Medica"
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Função strcmp

strcmp(a, b)

Resultado:

Valor Significado
0 iguais
diferente de 0 diferentes
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Erros Comuns

Overflow de String: A string excede o tamanho do vetor.

char nome[5];

scanf("%s", nome);

Entrada:

Linguagem

Esquecer o '\0':

char texto[3] = {'O', 'K'};
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Vetores de Strings

Armazena os caracteres diretamente em um bloco contíguo na memória.

#include <stdio.h>

int main() {
    char nomes[3][20] = {
        "Ana", 
        "Bob", 
        "Charlie"
    };
    printf("Tamanho total: %zu\n", sizeof(nomes)); 
    printf("%s\n", nomes[0]); 

    return 0;
}

Note que o tamanho das strings é fixo por linha. Isso desperdiça memória se strings forem curtas.

Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Percorrendo uma matriz de strings

#include <stdio.h>

int main() {
    char nomes[3][20] = {"Ana", "Bob", "Charlie"};
    for(int i = 0; i < 3; i++) {
        for(int j = 0; j < 20; j++) {
            printf("%c", nomes[i][j]); // Acessa caractere específico
            if(nomes[i][j] == '\0') {
                break; // Para no fim da string
            };
        }
        printf("\n");
    }
    return 0;
}

Dica: Use strlen ou verifique \0 para não imprimir lixo.

Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Exercícios

  1. Crie um programa que:
  • leia um texto
  • percorra todos os caracteres
  • exiba uma letra por linha
  1. Crie um programa que:
  • leia nome e sobrenome
  • concatene os textos
  • exiba o nome completo

Fonte da Imagem: Asmi Pai @Unsplash

Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Conclusão

String: Array de char + \0.

Strings são fundamentais porque:

  • permitem manipulação textual
  • aparecem em praticamente todos os sistemas

Material adicional:

Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Dúvidas e Discussão

Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Exercício e Questões

Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Questões teóricas

  1. Explique o papel do caractere \0 em uma string.
  2. Qual a diferença entre: scanf e fgets()?
  3. Ao chamar strcmp("B", "A"), qual valor será retornado? Será positivo, negativo ou zero?
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Exercício 1

Crie um programa que leia uma string e exiba:

  • quantidade de caracteres
  • primeira letra
  • última letra
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Exercício 2

Crie um programa que leia dois nomes de pacientes e informe:

  • se os nomes são iguais
  • qual possui maior quantidade de caracteres
Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

Exercício 3

Crie um programa que leia uma string e verifique se ela é um palíndromo.

Palíndromo é toda palavra ou frase que pode ser lida de trás para frente e que, independente da direção, mantém o seu sentido. Exemplos:

  • ada
  • ana
  • missa é assim.
  • o lobo ama o bolo.

Note que na tabela ASCII letras maiúsculas e minúsculas possuem códigos diferentes.

Prof. Dr. Denis M. L. Martins | martins.denis@usp.br

**Erro Comum:** ```c char nome[5] = "Hello"; // Erro de tempo de compilação! // "Hello" tem 6 bytes (H,e,l,l,o,\0). Array tem espaço para 5. ``` *Sempre reserve `n + 1` caracteres para uma string de tamanho `n`.*