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

[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
He7d3r.bot (discussão | contribs)
m Não é mais preciso inserir a navegação manualmente, basta manter a lista de capítulos do livro atualizada. Ver detalhes.
Yuu eo (discussão | contribs)
Pequenas correções, principalmente quanto a %f e %lf
Linha 1:
 
== Entrada e saída simples ==
 
Linha 16 ⟶ 15:
'''puts''' significa "put string" (colocar string), utilizado para "colocar" uma string na saída de dados. '''putchar''' significa "put char" (colocar caractere), utilizado para "colocar" um caractere na saída de dados.
 
São as funções mais simples do cabeçalho ''stdio.h''. Ambas enviam (ou "imprimem") à saída padrão os caracteres fornecidos a elas; <tt>putchar()</tt> manda apenas um caractere, e <tt>puts()</tt> manda uma seqüência de caracteres (ou ''string''). Exemplo:
 
puts ("Esta é uma demonstração da função puts.");
Linha 36 ⟶ 35:
 
<div style="background-color: #ddffdd; padding: 10px; margin: 20px;">
Note que o argumento '''deve''' ser uma seqüenciaseqüência de caracteres. Se você tentar, por exemplo, imprimir o número 42 desta maneira:
 
puts(42);
Linha 47 ⟶ 46:
== <tt>printf()</tt> ==
 
'''printf''' vem de "print fileformatted" (imprimir arquivoformatado).
 
À primeira vista, a função printf() pode parecer idêntica à puts(). No entanto, ela é muito mais poderosa. Ela permite facilmente imprimir valores que não são seqüências de caracteres, além de poder formatar os dados e juntar várias seqüências de caracteres. Por isso, a função printf() é muito mais usada que a puts().
Linha 107 ⟶ 106:
| <tt>%x</tt> || Número inteiro representado na base hexadecimal. Exemplo: 42f7 (corresponde ao decimal 17143). Se usarmos <tt>%X</tt>, as letras serão maiúsculas: 42F7.
|-
| <tt>%f</tt> || Número decimal de ponto flutuante (float). SeNo quisermoscaso usarda umfunção númeroprintf, dodevido tipoàs conversões implícitas da linguagem C, serve tanto para '''float''' como para '''double''',. usamosNo caso da função scanf, <tt>%lff</tt> emserve vezpara de'''float''' e <tt>%flf</tt> serve para '''double'''.
|-
| <tt>%e</tt> || Número em notação científica, por exemplo <tt>5.97e-12</tt>. Podemos usar %E para exibir o E maiúsculo (<tt>5.97E-12</tt>).
Linha 256 ⟶ 255:
scanf ("string de formatação", &amp;arg1, &amp;arg2, ...);
 
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.
 
Um exemplo básico da utilização de scanf() é este:
Linha 295 ⟶ 294:
 
* '''<tt>%a</tt>''', '''<tt>%e</tt>/<tt>%E</tt>''' e '''<tt>%g</tt>''' são sinônimos de <tt>%f</tt>.
 
* '''<tt>%lf</tt>''' deve ser usado para variáveis do tipo '''double'''.
 
* '''<tt>%s</tt>''' lê uma seqüência de caracteres não-brancos (qualquer caractere exceto espaço, tabulação, quebra de linha etc.), ou seja, uma palavra.
 
* '''<tt>%c</tt>''' lê uma seqüência de caracteres, '''sem ignorar espaços'''. O padrão é ler um caractere, se não for especificada a largura do campo.
 
* '''<tt>%[...]</tt>''' lê uma seqüência de caracteres, '''sem ignorar espaços''', especificando entre colchetes quais caracteres devem ser aceitos, ou, se o primeiro caractere dentro dos colchetes for um acento circunflexo (^), quais '''não''' devem ser aceitos. Além disso, se colocarmos um traço entre dois caracteres, todos os caracteres entre os dois serão incluídos no padrão. Por exemplo, se quisermos incluir qualquer letra minúscula, poderiámos escrever <tt>%[a-z]</tt>; se quiséssemos também incluir as maiúsculas, colocaríamos <tt>%[a-zA-Z]</tt>. A leitura pára quando for encontrado um caractere que não coincide com o padrão especificado.
 
Já os modificadores funcionam de maneira bastante diferente:
Linha 306 ⟶ 307:
* O modificador <tt>*</tt> (asterisco) especifica que o valor atual deve ser lido da maneira especificada, mas não será guardado em nenhuma variável, e portanto não deve haver um ponteiro correspondente a esse valor. Por exemplo, poderiámos ter um programa que espera ler uma palavra e depois um número, mas não importa qual palavra é. Nesse caso usaríamos o modificador *: <tt>scanf ("%*s %d", &numero)</tt>. O programa leria a palavra e guardaria o número na variável <var>numero</var>.
 
* Como na função printf(), existe o especificador de largura do campo, que deve aparecer antes do especificador de conversão, mas em scanf() ele especifica a '''largura máxima'''. Se a largura máxima foi definida como <var>n</var>, scanf() pulará para o próximo campo se já tiver lido <var>n</var> caracteres. Por exemplo, <tt>scanf ("%4d", &num)</tt> lerá um número de até quatro algarismos. Se o usuário digitar mais, o excedente será descartadonão será lido por essa chamada, ''mas poderá ser lido por uma próxima chamada a scanf''.
 
Mais detalhes sobre os especificadores de conversão e os modificadores podem ser encontrados na documentação da biblioteca padrão.
Linha 316 ⟶ 317:
int a, b;
int num;
num = scanf ("%d %d", &a, &b);
 
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.
 
<div style="background-color: #ddffdd; padding: 10px; margin: 20px;">Note que aqui introduzimos um conceito novo: o '''valor de retorno''' de uma função. Ele pode ser obtido simplesmente associando o valor de uma variável à chamada da função. Ele será detalhado na seção [[../Funções|Funções]], mas já é possível compreender um pouco sua utilização.</div>
Linha 346 ⟶ 347:
}
 
A notação <tt>char buffer[10]</tt>, que ainda não foi introduzida (e será detalhada na seção [[../Vetores|Vetores (arrays)]]), pede que seja reservado um espaço para 10 caracteres para a string <var>buffer</var>. Portanto, se usuário digitar mais de 9 caracteres (pois o terminador de string é adicionado ao que o usuário digitou), os caracteres excedentes adicionais serão colocados na área de memória subsequente à ocupada pela variável, escrevendo uma região de memória que não está reservada à string. Este efeito é conhecido como "estouro de buffer" e pode causar problemas imprevisíveis. Por isso, '''não se deve usar a função gets()'''; mais tarde introduziremos a função fgets(), que não apresenta esse problema e que deve ser usada no lugar de gets().
 
== <tt>sprintf()</tt> e <tt>sscanf()</tt> ==