Programar em C/Entrada e saída simples: diferenças entre revisões

[revisão pendente][revisão pendente]
Conteúdo apagado Conteúdo adicionado
Linha 321:
A função '''scanf()''' lê dados da entrada padrão (teclado) e os guarda em variáveis do programa. Assim como para printf(), usamos uma string de formatação para especificar como serão lidos os dados. A sintaxe de scanf() é esta:
 
<source lang="c">
scanf ("string de formatação", &amp;arg1, &amp;arg2, ...);
</source>
 
Como você pode ver, a sintaxe é quase igual à de printf(), com exceção do E comercial (&amp;). Você entenderá melhor o seu uso nas seções seguintes, mas adiantamos que ele é um operador que retorna o endereço de uma variável. Isso é necessário pois a função scanf() deve modificar as variáveis, e quando não usamos o operador de endereço, passamos apenas o valor de uma variável para a função. Isso será explicado melhor no capítulo sobre [[../Ponteiros|ponteiros]]. O fato de scanf receber endereços de variáveis (em vez de seus valores) também explica por que ele precisa ser informado da diferença entre %f (float) e %lf (double) enquanto que o printf não precisa.
Linha 327 ⟶ 329:
Um exemplo básico da utilização de scanf() é este:
 
<source lang="c">
int a;
scanf ("%d", &a);
</source>
 
O que este exemplo faz é declarar uma variável e aguardar o usuário digitar algo. Os dados só serão processados quando o usuário apertar Enter. Depois disso, os caracteres digitados pelo usuário serão convertidos para um valor inteiro e esse inteiro será guardado no endereço que corresponde à variável <var>a</var>. Se o valor digitado não puder ser convertido (porque o usuário não digitou nenhum algarismo válido), a variável não será modificada.
Linha 334 ⟶ 338:
Assim como na função printf(), podemos receber quantos valores quisermos, bastando usar vários especificadores de conversão:
 
<source lang="c">
int a;
char b;
float c;
scanf ("%d %c %f", &a,&b,&c);
</source>
 
Dessa maneira, se o usuário digitar <tt>120 z 17.63</tt>, teremos <var>a</var> igual a 120, <var>b</var> igual ao caractere 'z' e <var>c</var> igual ao número 17,63. Se o usuário tentar digitar mais de um espaço entre os dados ou simplesmente nenhum espaço, ainda assim o programa obterá os dados certos. Por exemplo, <tt>120z17.63</tt> também dará o mesmo resultado.
Linha 343 ⟶ 349:
Agora uma questão um pouco mais difícil: vamos supor que especificamos um formato inteiro e o usuário digitou um número real, como por exemplo <tt>12.5</tt>. O que deverá acontecer?
 
<source lang="c">
#include <stdio.h>
Linha 354 ⟶ 361:
return (0);
}
</source>
 
Se você testar com o valor <tt>12.5</tt>, vai ver que o programa retornará o número 12, pois a função <tt>scanf()</tt> apenas interpreta os caracteres válidos para aquele formato.
Linha 383 ⟶ 391:
A funcão <tt>scanf()</tt> retorna o número de conversões realizadas com sucesso. Isso é útil pois, se o valor contido numa variável após a chamada de scanf() for igual ao valor anterior, não é possível saber se o valor digitado foi o mesmo que já havia ou se não foi feita a conversão. Para obter esse número de conversões realizadas, você deve guardar o resultado numa variável do tipo <tt>int</tt>. Veja como proceder:
 
<source lang="c">
int a, b;
int num;
num = scanf("%d%d", &a, &b);
</source>
 
Este exemplo lê dois números inteiros e os guarda nas variáveis <var>a</var> e <var>b</var>. O número de conversões realizadas é guardado na variável <var>num</var>. Se após o scanf, <var>num</var> for diferente de 2, é sinal de que o usuário digitou algo incompatível com o formato desejado.