aula 152

Como converter um número em texto na linguagem C?

Vamos a mais uma aula de dúvidas? Na aula de hoje vamos aprender como converter um número em texto na linguagem C.

A dúvida original é: como utilizar o valor digitado pelo usuário na configuração da função scanf, para delimitar a quantidade máxima de caracteres que podem ser lidos do teclado. Para fazer isso, precisamos converter o número digitado para texto, e então montar a string de configuração para a função scanf.

Para fazer isso vamos utilizar uma função que faz parte da biblioteca padrão da linguagem C muito parecida com a função printf. Enquanto a função printf imprime dados na tela, existe uma função semelhante, a sprintf, que imprime dados em uma string.

Esta função recebe três parâmetros: a string onde serão escritos os dados; a máscara que indica o tipo de dado que será escrito; e a variável onde está o dado a ser convertido. Na linha a seguir temos um exemplo de utilização desta função. O valor convertido será salvo na string str, será um número inteiro, por isso o %d, e o conteúdo a ser convertido virá da variável valor.

    // exemplo de utilização da função sprintf
    sprintf(str, "%d", valor);

O padrão de configuração da função scanf para leitura de uma quantidade máxima de caracteres até que o ENTER seja pressionado é: “%x[^\n]”, isso indica ao computador para ler no máximo x caracteres até que a tecla ENTER seja pressionada. É exatamente esse padrão que desejamos formar, onde x virá de uma variável inteira.

Nossa variável str1 já começa com o %. Na sequência lemos o tamanho e salvamos na variável tam. Em seguida convertemos o números e salvamos em str2 juntamente com o par de colchetes e a quebra de linha. Assim, imaginando que o usuário digitou o tamanho 50, temos:

str1 = “%”
str2 = “50[^\n]”

O que precisamos fazer agora é concatenar a string str2 ao final da string str1 para obter a seguinte string:

str1 = “%50[^\n]”

Agora, ao fazer a leitura da string, perceba que utilizamos a string str1 dentro da função scanf.

Faço aqui duas observações.

Primeira. A função sprintf não faz nenhuma validação do tamanho do valor a ser convertido, ou seja, caso o usuário digite um valor muito grande poderemos continuar com o estouro de memória, lendo valores além da conta.

Para evitar isso é recomendado a utilização da função snprintf. Esta função recebe um parâmetro a mais que representa a quantidade máxima de caracteres da string de destino. Dessa forma, caso o usuário digite um valor muito grande e você, como programador, não faça nenhuma validação desse valor, será convertido os primeiros x caracteres e o restante não será convertido.

Segundo: o processo de concatenar as strings descrito acima pode ser descartado caso a conversão do valor já seja feito de forma completa, como a seguir, incluindo o % antes do valor numérico.

    // exemplo de utilização da função snprintf
    snprintf(str2, 10, "%%%d[^\n]", tam);

Assim como ocorre com a barra (\), quando desejamos imprimir o caracter % precisamos escreve-lo duas vezes, somado ao % do %d, temos então três %. Perceba que a conversão será feita já no formato que precisamos.

Código completo

#include <stdio.h>
#include <stdlib.h>

int main () {

    int tam;
    char str1[10] = {"%"}, str2[10];

    printf("Digite o tamanho do vetor: ");
    scanf("%d", &tam);
    scanf("%c");

    //sprintf(str2, "%d[^\n]", tam);
    snprintf(str2, 10, "%d[^\n]", tam);
    strcat(str1, str2);

    printf("%s\n", str2);

    char palavras[tam];
    printf("Digite uma frase: ");
    scanf(str1, palavras);
    printf("%s\n", palavras);

    return 0;
}


Este post tem um comentário

  1. Andreia g da siva

    Boa madrugada professor.
    Tenho uma questão muito difícil e precisava de sua ajuda:
    Como faço para converter uma ano de nascimento digitado pelo teclado (scanf) em números romanos na saída (printf)
    Grato pela atenção.

Deixe um comentário

oito + dezessete =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.