Linguagem C Entrada/Saída (console) Objetivos Nos artigos anteriores foram utilizadas as funções scanf() e printf(), porém não entramos em maiores detalhes. Agora estudaremos essas e outras funções de entrada e saída pelo console. Através deste artigo será possível entender melhor os programas publicados anteriormente. Pré-requisitos Para um melhor aprendizado é necessário que o leitor tenha acompanhado o artigo anterior, pois os artigos obedecem a uma seqüência. Nota: Este artigo faz parte do curso de Linguagem C Básico. Função printf() A função printf() já foi apresentada e explicada de forma simplificada no primeiro artigo. Agora teremos a oportunidade de rever esses conceitos e aprofundar mais no assunto. Essa função tem por finalidade imprimir dados na tela. Isto é feito através da sintaxe: printf( expressão de controle, lista de argumentos); Na expressão de controle são inseridos todos os caracteres a serem exibidos na tela e/ou códigos de formatação, responsáveis por indicar o formato em que os argumentos devem ser impressos. Esses argumentos devem estar incluídos na lista de argumentos e caso contenha mais de um devem ser separados por virgula. A lista abaixo mostra os tipos de códigos de formatação permitido na linguagem C.
Código de formatação Descrição %c Caracteres simples %d Inteiros decimais com sinal %I Inteiros decimais com sinal %e Notação cientifica (e minúsculo) %E Notacão cientifica (E maiúsculo) %f Ponto flutuante decimal %g Usa %e ou %f (qual for mais curto) %G Isa %E ou %F (qual for mais curto) %o Octal sem sinal %s Cadeia de caracteres %u Inteiros decimais sem sinal %x Hexadecimal sem sinal (letras minúsculas) %X Hexadecimal sem sinal (letras maiúsculas) %% Escreve o símbolo de porcentagem (%) Tabela 1: Tipos de códigos de formatação Ao colocar em printf() os comandos %e ou %E estaremos imprimindo em notação cientifica. No caso de usarmos %g ou %G o compilador decide se escreve em ponto flutuante ou notação cientifica, o qual for mais curto. Veja o exemplo abaixo:
Os códigos especiais (barra invertida) são apresentados abaixo e também pode ser inseridos na expressão de controle. Veja a descrição de cada um deles: Código especial Descrição \n Nova linha \t Tab \b Retrocesso \ Aspas \\ Barra \f Salta formulário \0 Nulo Tabela 2: Tipos de códigos especiais É possível também especificar o tamanho do campo, o número de casas decimais e justificar à esquerda a saída.
Ao colocar um número entre o símbolo % e o código de formatação estamos especificando a largura mínima do campo. Ou seja, caso o comprimento da saída seja menor ela é completada com espaços. Podemos também completar com zeros para isto coloca-se antes do número especificador de largura um zero. Por exemplo, colocaríamos %08d para que um inteiro decimal com um número de dígitos inferior a oito seja completado com zeros. Para indicar a precisão logo após o especificador de largura coloca-se um ponto seguido de um número inteiro. Quando se aplica a precisão em ponto flutuante estamos indicando o número de casas decimais que será mostrado. Por exemplo, %12.5f significa que o número ponto flutuante terá tamanho doze com cinco casas decimais. Já no caso do %g ou %G indica a quantidade de dígitos significativos. E em string especifica o numero Maximo de caracteres. Por padrão a saída é justificada à direita, mas pode ser justificada à esquerda quando acrescentamos logo atrás do % um sinal negativo. Por exemplo, %-12.5f. Função scanf() A função scanf() permite ler os dados de entrada do teclado. O seu uso é muito comum nos programas, como podemos verificar em outros artigos. Veja agora a sua sintaxe que é muito parecida com a do printf(). scanf( expressão de controle, argumentos); A expressão de controle é composta pelos códigos de formatação apresentados anteriormente que indica o tipo do dado a ser lido. A quantidade de argumentos deve ser igual a dos códigos de formatação e separadas por virgulas. A lista de argumentos deve ser constituída pelos endereços das variáveis. Para isto usamos o operador de endereço & que deve preceder o nome da variável que se deseja atribuir o valor da entrada. É necessário que o tipo de dado do argumento seja compatível com os códigos de formatação. Exemplo:
As funções printf() e scanf() fazem parte da biblioteca padrão de entrada e saída de dados. Portanto deve-se incluir a biblioteca stdio.h através da diretiva include. Isto é incluir a seguinte linha no começo dos programas: #include<stdio.h>. Trabalhando com caracteres Embora scanf() e printf() possa ser usadas para ler e escrever caracteres respectivamente, existem outras. Um exemplo disso são as funções getchar() e putchar() também pertencentes na biblioteca padrão c studio.h. Função getchar() Esta função é responsável por lê um caractere do teclado. Veja o exemplo abaixo:
A função original getchar() baseado em UNIX armazena a entrada no buffer até que seja pressionado ENTER. O que pode ser desagradável em ambientes interativos, pois deixa um ou mais caracteres esperando na fila depois que getchar() retorna. O padrão ANSI determina que a função getchar() pode ser implementada de forma interativa, mas na prática isso raramente acontece. Para resolver este problema pode-se utilizar outras funções alternativas como as getch() e getche(). Função putchar() Escreve na tela um caractere a partir da posição atual do cursor. Veja nosso próximo exemplo. Qualquer código barra invertida apresentado na tabela 2 podem ser usados com a função putchar(), como mostrado no programa acima.
As funções getch() e getche() As funções getch() e getcher() retornam imediatamente após uma tecla ser pressionada. A única diferença é que a getch() não mostra o caractere na tela enquanto que a getche() mostra. Na maioria dos compiladores C, a biblioteca a ser inserida no programa para utilizar essas duas funções é a conio.h. Essas funções serão usadas em programas futuros. Trabalhando com string Para ler e escrever strings por meio do console podemos também usar as funções gets() e puts() respectivamente. Sendo que os protótipos dessas funções são encontrados em stdio.h. As funções gets() e puts() Usando gets() é possível inserir caracteres pelo teclado até que o Enter seja pressionado. No final da string é colocado um terminador nulo e então a função retorna. A função puts() pode receber os códigos de barra invertida apresentados na tabela 2 neste artigo e é considerada muito mais rápida do que o printf(). O único problema é que puts() trabalha apenas com string de caracteres enquanto que o printf() trabalha com todos os tipos de dados.
Conclusão Conclui-se que existem vários tipos de entrada e saída de dados pelo console. Sendo que os mais comuns são as funções scanf() e printf(), pois podem ser usadas para qualquer tipo de dados existentes em C, além dos dados serem formatados com facilidade.