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; }
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.