Escolar Documentos
Profissional Documentos
Cultura Documentos
Converso/Formato do argumento
%d
Nmero decimal inteiro (int). Tambm pode ser usado %i como equivalente a %d.
%u
%o
%x
%X
%f
%e
%E
%g
%p
%c
converses implcitas da linguagem C, serve tanto para float como para double.
No caso da funo scanf, %f serve para float e%lf serve para double.
Nmero em notao cientfica, por exemplo 5.97e-12. Podemos usar %E para
exibir o E maisculo (5.97E-12).
Nmero em notao cientfica com o "e"maisculo
Escolhe automaticamente o mais apropriado entre %f e %e. Novamente, podemos
usar %G para escolher entre %f e %E.
Ponteiro: exibe o endereo de memria do ponteiro em notao hexadecimal.
Caractere: imprime o caractere que tem o cdigo ASCII correspondente ao valor
dado.
%s
%%
Imprime um %
' (aspa simples/apstrofe): nmeros decimais devem ser exibidos com separador
Se o valor for mais largo que o campo, este ser expandido para poder conter o
valor. O valor nunca ser cortado.
Se o valor for menor que o campo, a largura do campo ser preenchida com
espaos ou zeros. Os zeros so especificados pela opo 0, que precede a largura.
// exibe "
15"
// exibe "00015"
// exibe "15
"
// exibe "Jos
"
// exibe "
Jos"
// exibe "Jos"
Assim como a largura do campo, a preciso pode ser especificada diretamente por um
nmero ou com um asterisco, mas deve ser precedida por um ponto.
Alguns exemplos:
printf
printf
printf
printf
("%.5d",
("%.5f",
("%.5g",
("%.5s",
314);
// exibe "00314"
2.4);
// exibe "2.40000"
23456789012345); // exibe "2.3457e+13"
"Bom dia");
// exibe "Bom d"
claro que podemos combinar a largura com a preciso. Por exemplo, %10.4f indica um
campo de nmero real de comprimento total dez e com 4 casas decimais. Note que, na
largura do campo, o valor inteiro levado em conta, inclusive o ponto decimal, e no
apenas a parte inteira. Por exemplo, essa formatao aplicada ao nmero 3.45 ir resultar
nisto:
"
3.4500"
hh: indica que a converso inteira corresponde a uma varivel char. Por exemplo,
poderamos usar o formato %hhd para exibir uma varivel do tipo char na base
decimal.
ll: indica que a converso inteira corresponde a uma varivel long long.
Isso pode ser til, pois s vezes desejvel permanecer na mesma linha.
A seguir apresentamos a tabela com as sequncias de escape suportadas pela linguagem
C:
Sequncia
Significado
\n
\t
Tabulao horizontal
\b
\r
Retorno de carro (carriage return ou CR): volta o cursor para o comeo da linha
sem mudar de linha
\a
\f
\v
\"
Aspa dupla
\'
Aspa simples
\\
Barra invertida
\0
\N
\xN
Octal
\00
\12
\15
\07
\10
\13
Caracter
\0
\n
\r
\a
\b
\v
| editar cdigo-fonte]
Como voc pode ver, a sintaxe quase igual de printf(), com exceo do E comercial
(&). Voc entender melhor o seu uso nas sees seguintes, mas adiantamos que ele
um operador que retorna o endereo de uma varivel. Isso necessrio pois a funo
scanf() deve modificar as variveis, e quando no usamos o operador de endereo,
passamos apenas o valor de uma varivel para a funo. Isso ser explicado melhor no
captulo sobre ponteiros. O fato de scanf receber endereos de variveis (em vez de seus
valores) tambm explica por que ele precisa ser informado da diferena entre %f (float)
e %lf (double) enquanto que o printf no precisa.
Um exemplo bsico da utilizao de scanf() este:
int a;
scanf ("%d", &a);
O que este exemplo faz declarar uma varivel e aguardar o usurio digitar algo. Os
dados s sero processados quando o usurio apertar Enter. Depois disso, os caracteres
digitados pelo usurio sero convertidos para um valor inteiro e esse inteiro ser guardado
no endereo que corresponde varivel a. Se o valor digitado no puder ser convertido
(porque o usurio no digitou nenhum algarismo vlido), a varivel no ser modificada.
Assim como na funo printf(), podemos receber quantos valores quisermos, bastando
usar vrios especificadores de converso:
int a;
char b;
float c;
scanf ("%d %c %f", &a,&b,&c);
Dessa maneira, se o usurio digitar 120 z 17.63, teremos a igual a 120, b igual ao
caractere 'z' e c igual ao nmero 17,63. Se o usurio tentar digitar mais de um espao
entre os dados ou simplesmente nenhum espao, ainda assim o programa obter os
dados certos. Por exemplo, 120z17.63 tambm dar o mesmo resultado.
Agora uma questo um pouco mais difcil: vamos supor que especificamos um formato
inteiro e o usurio digitou um nmero real, como por exemplo 12.5. O que dever
acontecer?
#include <stdio.h>
int main ()
{
int a;
entre colchetes quais caracteres devem ser aceitos, ou, se o primeiro caractere dentro
dos colchetes for um acento circunflexo (^), quais no devem ser aceitos. Alm disso,
se colocarmos um trao entre dois caracteres, todos os caracteres entre os dois sero
includos no padro. Por exemplo, se quisermos incluir qualquer letra minscula,
poderimos escrever %[a-z]; se quisssemos tambm incluir as maisculas,
colocaramos %[a-zA-Z]. A leitura pra quando for encontrado um caractere que no
coincide com o padro especificado.
J os modificadores funcionam de maneira bastante diferente:
O modificador * (asterisco) especifica que o valor atual deve ser lido da maneira
especificada, mas no ser guardado em nenhuma varivel, e portanto no deve
haver um ponteiro correspondente a esse valor. Por exemplo, poderimos ter um
programa que espera ler uma palavra e depois um nmero, mas no importa qual
char c;
c = getchar();
No entanto, existe um problema com a funo gets(). Veja o exemplo a seguir:
#include <stdio.h>
int main()
{
char buffer[10];
printf("Entre com o seu nome: ");
gets(buffer);
printf("O nome : %s", buffer);
return 0;
}
A notao char buffer[10], que ainda no foi introduzida (e ser detalhada na
seo Vetores (arrays)), pede que seja reservado um espao para 10 caracteres para a
string buffer. Portanto, se usurio digitar mais de 9 caracteres (pois o terminador de string
adicionado ao que o usurio digitou), os caracteres excedentes adicionais sero
colocados na rea de memria subsequente ocupada pela varivel, escrevendo uma
regio de memria que no est reservada string. Este efeito conhecido como "estouro
de buffer" e pode causar problemas imprevisveis. Por isso, no se deve usar a funo
gets(); mais tarde introduziremos a funo fgets(), que no apresenta esse problema e
que deve ser usada no lugar de gets().
sprintf()
na sada padro ou lerem da entrada padro, escrevem ou lem em uma string. A nica
mudana nos argumentos a necessidade de especificar a string que deve ser lida ou
atribuda no incio. Veja os exemplos para entender melhor.
#include <stdio.h>
int main()
{
int i;
char string1[30];
printf("Entre um valor inteiro: ");
scanf("%d", &i);
sprintf(string1, "Valor de i = %d", i);
puts(string1);
return 0;
}
Nesse exemplo, a mensagem que queramos exibir na tela foi primeiramente salva em
uma string, e depois essa string foi enviada para a tela. Se voc olhar bem, se voc
tivesse alocado um valor menor parastring1, tambm ocorreria um estouro de buffer. Para
evitar esse problema, existe a funo snprintf, que tem mais um argumento: o tamanho
da string (deve ser colocado depois da string onde a mensagem ser gravada).
#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;
}
Nesse exemplo, usamos a funo sscanf para interpretar os valores contidos na string e
guard-los nas variveis numricas.