As funções que resumem todas as funções de entrada e saída formatada no C são as funções printf() e scanf(). Um domínio destas funções é fundamental ao programador.
Protótipo:
int printf (char *str,...);
As reticências no protótipo da função indicam que esta função tem um número de argumentos variável. Este número está diretamente relacionado com a string de controle str, que deve ser fornecida como primeiro argumento. A string de controle tem dois componentes. O primeiro são caracteres a serem impressos na tela. O segundo são os comandos de formato. Como já vimos, os últimos determinam uma exibição de variáveis na saída. Os comandos de formato são precedidos de %. A cada comando de formato deve corresponder um argumento na função printf(). Se isto não ocorrer podem acontecer erros imprevisíveis no programa.
Abaixo apresentamos a tabela de códigos de formato:
Código |
Formato |
%c | Um caracter (char) |
%d | Um número inteiro decimal (int) |
%i | O mesmo que %d |
%e | Número em notação científica com o "e"minúsculo |
%E | Número em notação científica com o "e"maiúsculo |
%f | Ponto flutuante decimal |
%g | Escolhe automaticamente o melhor entre %f e %e |
%G | Escolhe automaticamente o melhor entre %f e %E |
%o | Número octal |
%s | String |
%u | Decimal "unsigned" (sem sinal) |
%x | Hexadecimal com letras minúsculas |
%X | Hexadecimal com letras maiúsculas |
%% | Imprime um % |
%p | Ponteiro |
Vamos ver alguns exemplos:
Código |
Imprime |
printf ("Um %%%c %s",'c',"char"); | Um %c char |
printf ("%X %f %e",107,49.67,49.67); | 6B 49.67 4.967e1 |
printf ("%d %o",10,10); | 10 12 |
É possível também indicar o tamanho do campo, justificação e o número de casas decimais. Para isto usa-se códigos colocados entre o % e a letra que indica o tipo de formato.
Um inteiro indica o tamanho mínimo, em caracteres, que deve ser reservado para a saída. Se colocarmos então %5d estamos indicando que o campo terá cinco caracteres de comprimento no mínimo. Se o inteiro precisar de mais de cinco caracteres para ser exibido então o campo terá o comprimento necessário para exibi-lo. Se o comprimento do inteiro for menor que cinco então o campo terá cinco de comprimento e será preenchido com espaços em branco. Se se quiser um preenchimento com zeros pode-se colocar um zero antes do número. Temos então que %05d reservará cinco casas para o número e se este for menor então se fará o preenchimento com zeros.
O alinhamento padrão é à direita. Para se alinhar um número à esquerda usa-se um sinal - antes do número de casas. Então %-5d será o nosso inteiro com o número mínimo de cinco casas, só que justificado a esquerda.
Pode-se indicar o número de casas decimais de um número de ponto flutuante. Por exemplo, a notação %10.4f indica um ponto flutuante de comprimento total dez e com 4 casas decimais. Entretanto, esta mesma notação, quando aplicada a tipos como inteiros e strings indica o número mínimo e máximo de casas. Então %5.8d é um inteiro com comprimento mínimo de cinco e máximo de oito.
Vamos ver alguns exemplos:
Código |
Imprime |
printf ("%-5.2f",456.671); | | 456.67| |
printf ("%5.2f",2.671); | | 2.67| |
printf ("%-10s","Ola"); | |Ola | |
Nos exemplos o "pipe" ( | ) indica o início e o fim do campo mas não são escritos na tela.
Protótipo:
int scanf (char *str,...);
A string de controle str determina, assim como com a função printf(), quantos parâmetros a função vai necessitar. Devemos sempre nos lembrar que a função scanf() deve receber ponteiros como parâmetros. Isto significa que as variáveis que não sejam por natureza ponteiros devem ser passadas precedidas do operador &. Os especificadores de formato de entrada são muito parecidos com os de printf(). Os caracteres de conversão d, i, u e x podem ser precedidos por h para indicarem que um apontador para short ao invés de int aparece na lista de argumento, ou pela letra l (letra ele) para indicar que que um apontador para long aparece na lista de argumento. Semelhantemente, os caracteres de conversão e, f e g podem ser precedidos por l para indicarem que um apontador para double ao invés de float está na lista de argumento. Exemplos:
Código |
Formato |
%c | Um único caracter (char) |
%d | Um número decimal (int) |
%i | Um número inteiro |
%hi | Um short int |
%li | Um long int |
%e | Um ponto flutuante |
%f | Um ponto flutuante |
%lf | Um double |
%h | Inteiro curto |
%o | Número octal |
%s | String |
%x | Número hexadecimal |
%p | Ponteiro |
sprintf e sscanf são semelhantes a printf e scanf. Porém, ao invés de escreverem na saída padrão ou lerem da entrada padrão, escrevem ou leem em uma string. Os protótipos são:
int sprintf (char *destino, char *controle, ...);
int sscanf (char *destino, char *controle, ...);
Estas funções são muito utilizadas para fazer a conversão entre dados na forma numérica e sua representação na forma de strings. No programa abaixo, por exemplo, a variável i é "impressa" em string1. Além da representação de i como uma string, string1 também conterá "Valor de i=" .
#include <stdio.h> int main() { int i; char string1[20]; printf( " Entre um valor inteiro: "); scanf("%d", &i); sprintf(string1,"Valor de i = %d", i); puts(string1); return 0; }
Já no programa abaixo, foi utilizada a função sscanf para converter a informação armazenada em string1 em seu valor numérico:
#include <stdio.h> int main() { int i, j, k; char string1[]= "10 20 30"; sscanf(string1, "%d %d %d", &i, &j, &k); printf("Valores lidos: %d, %d, %d", i, j, k); return 0; }
AUTO AVALIAÇÃO
Veja como você está. Escreva um programa que leia (via teclado) e apresente uma matriz 3X3 na tela. Utilize os novos códigos de formato aprendidos para que a matriz se apresente corretamente identada. Altere os tipos de dados da matriz (int, float, double) e verifique a formatação correta para a identação. Verifique também a leitura e impressão de números hexadecimais.
Curso de C da EE/UFMG - 1996 - 2000