Caracteres e cadeias de caracteres

From Applied Science

É uma prática comum ensinar a utilizar caracteres depois de aprender a operar com variáveis numéricas, isso porque um caractere no computador é representado na forma de um código numérico. Isso é algo que costuma ser passado logo no início da disciplina, computadores não entendem palavras e não são capazes de interpretar nada, apenas executam operações lógicas elementares. Letras, símbolos, até os próprios números tem uma representação binária.

Os algoritmos que lidam com caracteres são os mesmos que lidam com números, a forma de pensar não muda. Portanto, é recomendável estudar e praticar bastante com os algoritmos numéricos. Para lidar com palavras, mais de um caractere ao mesmo tempo, é preciso do conceito de vetor. Portanto, qualquer problema com relação às 'strings' pode ser um problema no entendimento dos vetores.

Existem alguns problemas relacionados à compatibilidade dos programas em diferentes sistemas operacionais e com diferentes idiomas, mas isso não é um assunto da introdução. Esse é um tipo de problema mais técnico do que teórico, pois depende mais da linguagem utilizada e das bibliotecas disponíveis para uso. O professor não recomenda o uso de bibliotecas não padronizadas, como #conio.h. Pois se o professor está adotando apenas as bibliotecas padrão e os computadores usados na correção dos programas também adotam apenas bibliotecas padrão, o seu programa teria nota reduzida.

A lógica básica é: caracteres nada mais são do que códigos numéricos no computador, trabalhar com eles é trabalhar com números.

Erros de lógica:

  • Se há erros com os caracteres, o erro está nas operações aritméticas no algoritmo feito.


O que vem abaixo depende do conhecimento de vetores


  • Um simples programa que faz uso de caracteres:
#include <stdio.h>

int main() {
    char c1;
    unsigned char c2;
    int num1, num2;

    printf("Digite dois caracteres: ");
    scanf(" %c %c", &c1, &c2);

    num1 = c1;
    num2 = c2;

    printf("\nVoce digitou %c, cujo codigo ASCII eh %d (signed) ou %d (unsigned)", c1, num1, num2);
}

Não faz sentido somar, subtrair, caracteres de caracteres. Quando escrevemos uma operação aritmética com caracteres, estamos na realidade operando com os códigos numéricos que representam aqueles caracteres. Se executarmos uma operação que produz um código numérico fora da tabela ASCII, a saída será um código que não representa caractere nenhum.

Signed char vs Unsigned char: A diferença está na tabela ASCII, enquanto signed numera os 256 caracteres entre -128 e 127. unsigned numera os 256 caracteres entre 0 e 255. A diferença é pouco importante para uma introdução. Em termos práticos uma operação de "somar" ou "subtrair" muda se estivermos usando signed ou unsigned, pois o código numérico muda na tabela ASCII.

O espaço em branco antes do %c: Isso é um detalhe técnico da função scanf().


  • Um programa que conta quantas vezes uma determinada letra aparece numa frase e quantas palavras tem uma frase:
#include <stdio.h>

int main() {
    char frase[100], letra;
    int i,
        cont = 0, 
        cont2 = 0;

    printf("Digite uma frase: ");
    scanf("%[^\n]", frase); 
    printf("\nFrase: %s", frase);

    printf("\nEscolha um caractere para contar: ");
    scanf(" %c", &letra);

    for (i = 0; frase[i] != 0; i++) {
         if (frase[i] == letra) cont++;
         if (frase[i + 1] == ' ' || frase[i + 1] == '\0') cont2++;
    }

    printf("O caractere '%c' foi encontrado %d vezes. A frase contem %d palavras.", letra, cont, cont2);
}

Perceba que o algoritmo está comparando os códigos ASCII armazenados no vetor e na variável, ambas do tipo char. O contador de palavras se baseia num simples fato: toda palavra é separada da outra por um espaço. A última palavra da frase termina com um caractere nulo, que também indica o término da sequência.

Fim da sequência com 0: O vetor precisa ter uma posição a mais para guardar os caracteres, pois o último deve ser o caractere nulo. É preciso bastante cuidado aqui para não confundir o caractere nulo, cujo código ASCII é 0 e cuja representação entre aspas simples é '\0' do número 0. O dígito 0 tem um código ASCII número 48. O caractere nulo, quando impresso, não produz nenhum caractere na tela.