Post on 22-Apr-2015
CES-10 INTRODUÇÃO CES-10 INTRODUÇÃO À COMPUTAÇÃOÀ COMPUTAÇÃO
Capítulo V Capítulo V
Comandos de Entrada e Comandos de Entrada e SaídaSaída
Capítulo V – Comandos de Capítulo V – Comandos de Entrada e SaídaEntrada e Saída
5.1 – Equipamentos de entrada e saída5.1 – Equipamentos de entrada e saída
5.2 – Saída no vídeo-texto5.2 – Saída no vídeo-texto
5.3 – Entrada pelo teclado5.3 – Entrada pelo teclado
5.4 – Entrada e saída por arquivos em 5.4 – Entrada e saída por arquivos em discodisco
5.5 – Controle do vídeo-texto5.5 – Controle do vídeo-texto
5.6 – Vídeo-gráfico5.6 – Vídeo-gráfico
5.1 – Equipamentos de 5.1 – Equipamentos de Entrada e SaídaEntrada e Saída
São os equipamentos responsáveis pela São os equipamentos responsáveis pela comunicaçãocomunicação do computador com o do computador com o mundo mundo exteriorexterior
Equipamentos de entrada mais conhecidos: Equipamentos de entrada mais conhecidos: tecladoteclado e e mousemouse
Teclado:Teclado: muito usado para edição de documentos muito usado para edição de documentos (programas, textos, arquivos de dados, etc.) (programas, textos, arquivos de dados, etc.)
Mouse:Mouse: para selecionar e executar tarefas para selecionar e executar tarefas sugeridas por botões e menus apresentados na telasugeridas por botões e menus apresentados na tela
Drive de disquetes:Drive de disquetes: muito usado durante bom muito usado durante bom tempo para entrada e saída, mas já tempo para entrada e saída, mas já completamente substituído pelo completamente substituído pelo drive de CD-drive de CD-DVD-ROMDVD-ROM
Outros importantes Outros importantes dispositivos de entradadispositivos de entrada: :
- Microfone- Microfone - Web-Cam- Web-Cam
- Scanner- Scanner - Leitora óptica- Leitora óptica
- Célula fotossensora- Célula fotossensora - Pen-drive- Pen-drive
- Sensores para controle de processos - Sensores para controle de processos industriaisindustriais
- Etc.- Etc.
Equipamentos de saída mais conhecidos:Equipamentos de saída mais conhecidos:
Vídeo Vídeo Auto-falante Auto-falante Impressoras (a jato de tinta, a laser, etc.) Impressoras (a jato de tinta, a laser, etc.) Impressor de gráficos (plotter) Impressor de gráficos (plotter)
Há Há vídeosvídeos para entrada de dados: para entrada de dados:
Substituem o Substituem o mousemouse A seleção de tarefas dos menus e botões A seleção de tarefas dos menus e botões
pode ser feita por toque de dedo, caneta ou pode ser feita por toque de dedo, caneta ou lápis apropriadoslápis apropriados
Equipamentos industriaisEquipamentos industriais controlados por controlados por computador: computador:
PrensasPrensas Tanques para banhos químicosTanques para banhos químicos Robôs, etc. Robôs, etc.
Eles são considerados Eles são considerados unidades de saídaunidades de saída de de um computadorum computador
HD’s e fitas magnéticasHD’s e fitas magnéticas são considerados são considerados como:como:
Memória secundáriaMemória secundária Equipamentos de entrada e saídaEquipamentos de entrada e saída
Este capítulo limita-se a apresentar entrada Este capítulo limita-se a apresentar entrada pelo pelo tecladoteclado, saída pelo , saída pelo vídeovídeo e entrada e e entrada e saída por saída por arquivos em discoarquivos em disco
São usados dispositivos de programação da São usados dispositivos de programação da Linguagem CLinguagem C
Capítulo V – Comandos de Capítulo V – Comandos de Entrada e SaídaEntrada e Saída
5.1 – Equipamentos de entrada e saída5.1 – Equipamentos de entrada e saída
5.2 – Saída no vídeo-texto5.2 – Saída no vídeo-texto
5.3 – Entrada pelo teclado5.3 – Entrada pelo teclado
5.4 – Entrada e saída por arquivos em 5.4 – Entrada e saída por arquivos em discodisco
5.5 – Controle do vídeo-texto5.5 – Controle do vídeo-texto
5.6 – Vídeo-gráfico5.6 – Vídeo-gráfico
5.2 – Saída no Vídeo-Texto5.2 – Saída no Vídeo-Texto
5.2.1 – Vídeo-texto e vídeo-gráfico5.2.1 – Vídeo-texto e vídeo-gráfico
O vídeo de um computador é uma O vídeo de um computador é uma área área retangularretangular constituída por um conjunto de constituída por um conjunto de áreas minúsculasáreas minúsculas de tamanho uniforme de tamanho uniforme denominadas denominadas pixelspixels
Cada Cada pixelpixel pode ter pode ter coloraçãocoloração e e brilhobrilho distintos distintos
Essa área é dividida ortogonalmente em um Essa área é dividida ortogonalmente em um conjunto de conjunto de linhaslinhas e de e de colunascolunas de de pixelspixels
Todas as Todas as linhaslinhas têm o têm o mesmo número de mesmo número de pixelspixels
Todas as Todas as colunascolunas têm o têm o mesmo número de mesmo número de pixelspixels
As As linhaslinhas e as e as colunascolunas do vídeo são do vídeo são numeradasnumeradas
Cada Cada pixelpixel pode ser pode ser identificadoidentificado pelos números pelos números de sua de sua colunacoluna e de sua e de sua linhalinha ( (coordenadascoordenadas do do pixel)pixel)
Foram muito comuns vídeos com Foram muito comuns vídeos com 640 x 480 640 x 480 pixelspixels, mas hoje há vídeos com , mas hoje há vídeos com números bem números bem maioresmaiores
Para Para textostextos no vídeo, os caracteres costumam no vídeo, os caracteres costumam ocupar ocupar pequenos retângulospequenos retângulos de pixels de pixels
Em ambientes de programação, tipicamente Em ambientes de programação, tipicamente um um caracterecaractere ocupa uma área de ocupa uma área de 11x7 pixels11x7 pixels
Nos computadores Nos computadores mais antigosmais antigos, os diversos , os diversos programas programas só exibiam textossó exibiam textos em sua tela de em sua tela de vídeo vídeo
Os Os caracterescaracteres ocupavam áreas de pixels de ocupavam áreas de pixels de igual tamanho denominadas igual tamanho denominadas espaços para espaços para caracterescaracteres
A tela era dividida em A tela era dividida em 25 linhas25 linhas e e 80 colunas80 colunas desses espaços desses espaços
Cada espaço tinha suas Cada espaço tinha suas coordenadascoordenadas na tela, na tela, que eram os números de sua que eram os números de sua linhalinha e de sua e de sua colunacoluna
Os programas não acessavam os pixels Os programas não acessavam os pixels individualmenteindividualmente, mas sim os , mas sim os espaços para espaços para caracterescaracteres
O nome dessa organização é O nome dessa organização é vídeo-textovídeo-texto
Em contraposição, a organização que permite o Em contraposição, a organização que permite o acesso individual aos pixels é denominada acesso individual aos pixels é denominada vídeo-gráficovídeo-gráfico
Até agora os programas só utilizaram o Até agora os programas só utilizaram o vídeo-vídeo-textotexto
A maioria dos ambientes de programação A maioria dos ambientes de programação abrem, para a execução de um programa, uma abrem, para a execução de um programa, uma tela que maximizada tem tela que maximizada tem 80 colunas de 80 colunas de espaços para caracteres (vídeo-texto)espaços para caracteres (vídeo-texto)
As funções As funções scanf scanf e e printfprintf e outras produzem e outras produzem nela seus efeitos nela seus efeitos
Caso se deseje manipular o Caso se deseje manipular o vídeo-gráficovídeo-gráfico, , cada ambiente tem um conjunto de cada ambiente tem um conjunto de funções funções destinadas a esse fimdestinadas a esse fim
Isso deve ser visto no Isso deve ser visto no Tópico 5.6Tópico 5.6 deste deste capítulo; antes dele, será estudado o capítulo; antes dele, será estudado o vídeo-vídeo-textotexto
5.2.2 – Escrita de um só caractere5.2.2 – Escrita de um só caractere
A macro A macro putcharputchar, pertencente ao arquivo , pertencente ao arquivo stdio.hstdio.h, escreve no vídeo um caractere , escreve no vídeo um caractere fornecido como argumentofornecido como argumento
Exemplo:Exemplo: pelos comandos pelos comandos
c = ‘b’;c = ‘b’;
putchar (c + ‘A’ – ‘a’);putchar (c + ‘A’ – ‘a’);
será escrito no vídeo o caractere será escrito no vídeo o caractere ‘B’‘B’
c + ‘A’ - ‘a’ =‘b’ + 65 - 97 =98 - 32 = 66 = ‘B’
5.2.3 – Escrita de cadeias de caracteres 5.2.3 – Escrita de cadeias de caracteres e valores de expressõese valores de expressões
A função A função printfprintf, pertencente ao arquivo , pertencente ao arquivo stdio.hstdio.h, , destina-se a escrever no vídeo sequências de destina-se a escrever no vídeo sequências de caracterescaracteres e valores de e valores de expressõesexpressões
Forma geral:Forma geral:
printf (CadeiaDeControle, printf (CadeiaDeControle, OutrosArgumentos);OutrosArgumentos);
CadeiaDeControle CadeiaDeControle contém:contém: Caracteres a serem escritosCaracteres a serem escritos Caracteres com formatação para escrever os Caracteres com formatação para escrever os
OutrosArgumentosOutrosArgumentos
Exemplo: Exemplo: seja a seguinte chamada de seja a seguinte chamada de printfprintf
printf (“A loja vende %d %s por R$%f”, 5, “cds”, printf (“A loja vende %d %s por R$%f”, 5, “cds”, 5*12.00);5*12.00);
Cadeia de controle:Cadeia de controle: “A loja vende %d %s por “A loja vende %d %s por R$%f”R$%f”
Outros argumentos:Outros argumentos: 5, “cds”, 5*12.00 5, “cds”, 5*12.00
Saída no vídeo:Saída no vídeo: A loja vende 5 cds por A loja vende 5 cds por R$60.000000R$60.000000
Todos os caracteres da Todos os caracteres da cadeia de controlecadeia de controle, , inclusive os espaços, são escritos, exceto os inclusive os espaços, são escritos, exceto os formatos de escritaformatos de escrita
printf (“A loja vende %d %s por R$%f”, 5, “cds”, printf (“A loja vende %d %s por R$%f”, 5, “cds”, 5*12.00);5*12.00);
Saída no vídeo:Saída no vídeo: A loja vende 5 cds por A loja vende 5 cds por R$60.000000R$60.000000
%d: %d: formato para escrever formato para escrever 55 em inteiro-decimal em inteiro-decimal
%s: %s: formato para escrever a cadeia de caracteres formato para escrever a cadeia de caracteres “cds” “cds” sem as aspassem as aspas
%f: %f: formato para escrever o valor da expressão formato para escrever o valor da expressão 5*12.00 5*12.00 em real-decimal com em real-decimal com 66 dígitos dígitos fracionáriosfracionários
Trocando-se Trocando-se %f%f por por %d%d, ou , ou 5*12.005*12.00 por por 5*125*12, os , os resultados serão incorretosresultados serão incorretos
Tabela de formatos de escrita da Linguagem Tabela de formatos de escrita da Linguagem C:C:
Exemplo: Exemplo: formatos para reaisformatos para reais
Seja o trecho de programa:Seja o trecho de programa:
float x = 12.34;float x = 12.34;
printf ("Formato f: x = %f\n", x);printf ("Formato f: x = %f\n", x);
printf ("Formato g: x = %g\n", x);printf ("Formato g: x = %g\n", x);
printf ("Formato e: x = %e", x);printf ("Formato e: x = %e", x);
Formato f: x = 12.340000Formato g: x = 12.34Formato e: x = 1.234000e+01
Resultado
5.2.4 – Especificação do campo para 5.2.4 – Especificação do campo para escritaescrita
Seja o seguinte trecho de programaSeja o seguinte trecho de programa::
int x;int x;
printf (" x x^2 x^3 e^x log10(x)");printf (" x x^2 x^3 e^x log10(x)");
printf (“\n---------------------------------------------");printf (“\n---------------------------------------------");
for (x = 1; x <= 10; x++)for (x = 1; x <= 10; x++)
printf (“\n %d %d %d %f %f",printf (“\n %d %d %d %f %f",
x, x*x, x*x*x, exp(x), log10(x));x, x*x, x*x*x, exp(x), log10(x)); x x^2 x^3 e^x log10(x)--------------------------------------------- 1 1 1 2.718282 0.000000 2 4 8 7.389056 0.301030 3 9 27 20.085537 0.477121 4 16 64 54.598150 0.602060 5 25 125 148.413159 0.698970 6 36 216 403.428793 0.778151 7 49 343 1096.633158 0.845098 8 64 512 2980.957987 0.903090 9 81 729 8103.083928 0.954243 10 100 1000 22026.465795 1.000000
Resultado:
Colunas desalinhadas
x, x2, x3, ex usam diferentes nos de dígitos para diferentes valores de x
Trocando-se as chamadas de printfTrocando-se as chamadas de printf::printf (" x x^2 x^3 e^x log10(x)\n");printf (" x x^2 x^3 e^x log10(x)\n");
printf (" %d %d %d %f %f\n",printf (" %d %d %d %f %f\n",
x, x*x, x*x*x, exp(x), log10(x));x, x*x, x*x*x, exp(x), log10(x));
respectivamente por:respectivamente por:printf ("%4s%9s%9s%20s%11s","x", "x^2", "x^3", "e^x", printf ("%4s%9s%9s%20s%11s","x", "x^2", "x^3", "e^x", "log10(x)");"log10(x)");
printf ("\n%4d%9d%9d%20f%11f", x, x*x, x*x*x, exp(x), printf ("\n%4d%9d%9d%20f%11f", x, x*x, x*x*x, exp(x), log10(x));log10(x));
x x^2 x^3 e^x log10(x)----------------------------------------------------- 1 1 1 2.718282 0.000000 2 4 8 7.389056 0.301030 3 9 27 20.085537 0.477121 4 16 64 54.598150 0.602060 5 25 125 148.413159 0.698970 6 36 216 403.428793 0.778151 7 49 343 1096.633158 0.845098 8 64 512 2980.957987 0.903090 9 81 729 8103.083928 0.954243 10 100 1000 22026.465795 1.000000
%20s escreve a cadeia “e^x” num espaço de 20 casas, justaposto à direita
%20f escreve o valor de exp(x) num espaço de 20 casas, justaposto à direita
Para justapor à esquerda, usar o sinal ‘-’ Para justapor à esquerda, usar o sinal ‘-’ (menos)(menos)::printf ("%-4s%-9s%-9s%20s%11s","x", "x^2", "x^3", "e^x", printf ("%-4s%-9s%-9s%20s%11s","x", "x^2", "x^3", "e^x", "log10(x)");"log10(x)");
printf ("\n%-4d%-9d%-9d%20f%11f", x, x*x, x*x*x, exp(x), printf ("\n%-4d%-9d%-9d%20f%11f", x, x*x, x*x*x, exp(x), log10(x));log10(x));
x x^2 x^3 e^x log10(x)-----------------------------------------------------1 1 1 2.718282 0.0000002 4 8 7.389056 0.3010303 9 27 20.085537 0.4771214 16 64 54.598150 0.6020605 25 125 148.413159 0.6989706 36 216 403.428793 0.7781517 49 343 1096.633158 0.8450988 64 512 2980.957987 0.9030909 81 729 8103.083928 0.95424310 100 1000 22026.465795 1.000000
5.2.5 – Especificação da precisão para 5.2.5 – Especificação da precisão para nnosos reais reais
Seja o seguinte trecho de programaSeja o seguinte trecho de programa::
double x = 12.3456789012;double x = 12.3456789012;
printf ("Formato f: x = %15.7f\n", x);printf ("Formato f: x = %15.7f\n", x);
printf ("Formato g: x = %15.7g\n", x);printf ("Formato g: x = %15.7g\n", x);
printf ("Formato e: x = %15.7e", x);printf ("Formato e: x = %15.7e", x);
Formato f: x = 12.3456789Formato g: x = 12.34568Formato e: x = 1.2345679e+01
Resultado
2º número dentro do formato:
Formatos %f e %e:no de casas após o ponto
Formato %g:no total de dígitos a serem escritos
22oo número para outros formatos: número para outros formatos:
Seja o seguinte trecho de programaSeja o seguinte trecho de programa::
printf ("Formato d: %10.7d\n", 1234); printf ("Formato d: %10.7d\n", 1234);
printf ("Formato c: %10.7c\n", 'B');printf ("Formato c: %10.7c\n", 'B');
printf ("Formato s+: %10.5s\n", "ABCDEFGH");printf ("Formato s+: %10.5s\n", "ABCDEFGH");
printf ("Formato s-: %-10.5s", "ABCDEFGH");printf ("Formato s-: %-10.5s", "ABCDEFGH");
Formato d: 0001234Formato c: BFormato s+: ABCDEFormato s-: ABCDE
Resultado
Formato %d: acrescenta zeros à esquerda até chegar ao 2o número
Formato %c: sem utilidade
Formato %s: número de caracteres escritos
5.2.6 – Variação no campo de escrita e 5.2.6 – Variação no campo de escrita e na precisãona precisão
Seja o seguinte esqueleto de chamada de Seja o seguinte esqueleto de chamada de printfprintf::
printf (“Valor = %*.*f”, printf (“Valor = %*.*f”,
expressao1, expressao2, expressao3);expressao1, expressao2, expressao3);
Nesta chamada, será escrito o valor de Nesta chamada, será escrito o valor de expressao3expressao3: :
Num espaço dado pelo valor de Num espaço dado pelo valor de expressao1expressao1
Com um número de dígitos após o ponto dado Com um número de dígitos após o ponto dado pelo valor de pelo valor de expressao2expressao2
Exemplo: sExemplo: seja o seguinte trecho de programa:eja o seguinte trecho de programa:
double x = 337.3777337337;double x = 337.3777337337;
int n;int n;
for (n = 1; n<=7; n++)for (n = 1; n<=7; n++)
printf ("###%*.*f###\n", 8+n, n, x);printf ("###%*.*f###\n", 8+n, n, x);
### 337.4###### 337.38###### 337.378###### 337.3777###### 337.37773###### 337.377734###### 337.3777337###
Resultado
A cada repetição do comando for:
A precisão e o tamanho do campo de escrita crescem de uma unidade
Exemplo: Exemplo: traçado da curva deitada de uma traçado da curva deitada de uma função:função:
Seja a função Seja a função y = xy = x22 – 2x – 3 – 2x – 3, no intervalo , no intervalo [-2, 4][-2, 4]
O eixo das O eixo das ordenadasordenadas ficará na ficará na horizontalhorizontal
O eixo das O eixo das abscissasabscissas ficará na ficará na verticalvertical, na , na coluna 10coluna 10 do vídeo-texto do vídeo-texto
Assim a função muda para Assim a função muda para y = 10 + xy = 10 + x22 – 2x – 3 – 2x – 3
Os pontos da curva serão escritos com o Os pontos da curva serão escritos com o caractere caractere ‘#’‘#’
y = 10 + xy = 10 + x22 – 2x – 3 – 2x – 3, no intervalo , no intervalo [-2, 4][-2, 4]
Seja o seguinte trecho de programa:Seja o seguinte trecho de programa:
int x;int x;
for (x = -2; x<=4; x++)for (x = -2; x<=4; x++)
printf ("%*c\n", 10 + x*x - 2*x - 3, '#');printf ("%*c\n", 10 + x*x - 2*x - 3, '#');
x y
-2 15
-1 10
0 7
1 6
2 7
3 10
4 15
Tabela paray = 10 + x2 –
2x – 3
Resultado no vídeo
Exemplo: Exemplo: sofisticações no desenho da curva:sofisticações no desenho da curva:
Seja a função Seja a função y = xy = x22 – 2x – 3 – 2x – 3, no intervalo , no intervalo [-5, [-5, 7]7]
O eixo das O eixo das abscissasabscissas ficará na ficará na verticalvertical, na , na coluna 5coluna 5 do vídeo-texto do vídeo-texto
Assim a função muda para Assim a função muda para y = 5 + xy = 5 + x22 – 2x – 3 – 2x – 3
Serão desenhados os dois Serão desenhados os dois eixoseixos e uma e uma réguarégua
Resultado a ser obtido para Resultado a ser obtido para y = xy = x22 – 2x – 3 – 2x – 3 em em [-[-5, 7]5, 7]
Programa:Programa:
#include <stdio.h>#include <stdio.h>
#include <stdlib.h>#include <stdlib.h>
int main () {int main () {
int x, j, func;int x, j, func;
/* Tracado da regua *//* Tracado da regua */
printf ("----|----|----|----|----|----|----|----|\n");printf ("----|----|----|----|----|----|----|----|\n");
/* Calculo da funcao no intervalo [-5, +7] *//* Calculo da funcao no intervalo [-5, +7] */
for (x=-5;x<=7;x++) {for (x=-5;x<=7;x++) {
func = 5 + x*x - 2*x - 3;func = 5 + x*x - 2*x - 3;
/* Se x!=0, marcar o ponto da curva e um ponto do eixo das /* Se x!=0, marcar o ponto da curva e um ponto do eixo das abscissas */abscissas */
if (x != 0) {if (x != 0) {
if (func < 5) printf ("%*c%*c", func, '*', 5-if (func < 5) printf ("%*c%*c", func, '*', 5-func, func, '|');'|');
else if (func == 5) printf ("%*c", func, '*');else if (func == 5) printf ("%*c", func, '*');
else printf ("%*c%*c", 5, '|', func-5, '*');else printf ("%*c%*c", 5, '|', func-5, '*');
}}
/* Se x=0, tracar tambem o eixo das ordenadas *//* Se x=0, tracar tambem o eixo das ordenadas */
elseelse
for (j=1; j<=40; j++)for (j=1; j<=40; j++)
if (j == func) printf ("%c", '*');if (j == func) printf ("%c", '*');
else if (j == 5) printf ("%c", '|');else if (j == 5) printf ("%c", '|');
else printf ("%c", '-');else printf ("%c", '-');
printf ("\n");printf ("\n");
}}
printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;
}}
5.2.7 – Valor retornado por printf5.2.7 – Valor retornado por printf
printf printf retorna o número de caracteres escritos retorna o número de caracteres escritos pela execução de sua chamada pela execução de sua chamada
Esse valor Esse valor não é muito usadonão é muito usado em programas em programas corriqueiroscorriqueiros
Exemplo: Exemplo: Seja o trecho de programa:Seja o trecho de programa:
int i;int i;
i = printf ("A loja vende %d %s por R$%f", 5, i = printf ("A loja vende %d %s por R$%f", 5, "cds", 5*12.0);"cds", 5*12.0);
printf ("\n\nNumero de caracteres escritos: %d", printf ("\n\nNumero de caracteres escritos: %d", i);i);
A loja vende 5 cds por R$60.000000
Numero de caracteres escritos: 34Resultad
o
Capítulo V – Comandos de Capítulo V – Comandos de Entrada e SaídaEntrada e Saída
5.1 – Equipamentos de entrada e saída5.1 – Equipamentos de entrada e saída
5.2 – Saída no vídeo-texto5.2 – Saída no vídeo-texto
5.3 – Entrada pelo teclado5.3 – Entrada pelo teclado
5.4 – Entrada e saída por arquivos em 5.4 – Entrada e saída por arquivos em discodisco
5.5 – Controle do vídeo-texto5.5 – Controle do vídeo-texto
5.6 – Vídeo-gráfico5.6 – Vídeo-gráfico
5.3 – Entrada pelo Teclado5.3 – Entrada pelo Teclado
5.3.1 – O teclado e seu buffer5.3.1 – O teclado e seu buffer
Algumas funções da biblioteca destinadas a fazer Algumas funções da biblioteca destinadas a fazer entrada de dadosentrada de dados, retiram os dados do , retiram os dados do buffer do buffer do tecladoteclado
Caso ele esteja Caso ele esteja vaziovazio, o computador fica , o computador fica aguardandoaguardando o operador digitar uma sequência de o operador digitar uma sequência de caracteres encerrada pela tecla caracteres encerrada pela tecla enterenter, enchendo-, enchendo-oo
Então os dados são retirados daliEntão os dados são retirados dali
Caso contrário, não há necessidade de se Caso contrário, não há necessidade de se digitar digitar nadanada, pois , pois já há dadosjá há dados a serem lidos a serem lidos
Outras funções de entrada Outras funções de entrada não utilizam tal não utilizam tal bufferbuffer e ficam aguardando digitação e ficam aguardando digitação
A macro A macro getchargetchar e a função e a função scanfscanf usam esse usam esse bufferbuffer
As funções As funções getchgetch e e getchegetche não o utilizam não o utilizam
getchargetchar, , getchgetch e e getchegetche são vistas a seguir são vistas a seguir
5.3.2 – Leitura de um só caractere5.3.2 – Leitura de um só caractere
Pode ser feita pela macro Pode ser feita pela macro getchargetchar ou pelas ou pelas funções funções getchgetch e e getchegetche
Elas retornam o Elas retornam o código ASCIIcódigo ASCII do caractere do caractere digitadodigitado
A macro A macro getchargetchar localiza-se no arquivo localiza-se no arquivo stdio.hstdio.h
Ela utiliza o Ela utiliza o buffer do tecladobuffer do teclado
Exemplo: Exemplo: mesmo programa para reescrever as mesmo programa para reescrever as letras maiúsculas digitadasletras maiúsculas digitadas
Trocou-se Trocou-se scanfscanf por por getchar getchar e um dos e um dos printfprintf’s ’s por por putcharputchar
#include <stdio.h>#include <ctype.h>#include <stdlib.h>int main () {
char c;printf ("Digite uma frase encerrada por enter:\n\n\
t"); c = getchar();printf ("\nLetras maiusculas digitadas:\n\n\t");while (!iscntrl (c)) {
if (isupper (c)) putchar(c);c = getchar();
} printf ("\n\n"); system ("pause"); getch ();}
As funções As funções getch getch e e getchegetche localizam-se no localizam-se no arquivo arquivo conio.hconio.h
Elas não utilizam o Elas não utilizam o buffer do tecladobuffer do teclado
Ficam Ficam aguardandoaguardando o operador digitar uma o operador digitar uma tecla tecla
getche getche dá eco no vídeodá eco no vídeo
getch getch não dá eco no vídeonão dá eco no vídeo
Exemplo:Exemplo: seja trecho de programa seja trecho de programa
ResultadoResultado quando o operador digita quando o operador digita ‘x’‘x’ e e ‘8’‘8’::
char c;printf ("Digite uma tecla: "); c = getch ();printf ("\n\nTecla digitada: %c", c);printf ("\n\nDigite uma tecla: "); c = getche ();printf ("\n\nTecla digitada: %c", c);
Digite uma tecla:
Tecla digitada: x
Digite uma tecla: 8
Tecla digitada: 8
As funções As funções getch getch e e getchegetche podem ser usadas podem ser usadas para controlar o para controlar o fechamento da telafechamento da tela de de execução. Exemplo:execução. Exemplo:
#include <stdio.h>#include <stdio.h>
#include <conio.h> // Dispensado no CodeBlocks#include <conio.h> // Dispensado no CodeBlocks
int main () {int main () {
printf ("Teste de getch:");printf ("Teste de getch:");
printf ("\n\nDigite algo para encerrar: ");printf ("\n\nDigite algo para encerrar: ");
getch ();getch (); return 0; return 0;
}}
Obs.: Obs.: o valor retornado por o valor retornado por getchgetch, que é o , que é o código ASCII do caractere digitado, código ASCII do caractere digitado, não é não é atribuídoatribuído a nenhuma variável a nenhuma variável
5.3.3 – Leitura de valores para várias 5.3.3 – Leitura de valores para várias variáveisvariáveis
A função A função scanfscanf pertencente ao arquivo pertencente ao arquivo stdio.hstdio.h destina-se a ler informações do destina-se a ler informações do buffer do buffer do tecladoteclado e armazená-las em e armazená-las em variáveisvariáveis especificadasespecificadas
Tais Tais informaçõesinformações devem estar contidas em uma devem estar contidas em uma ou mais ou mais cadeias de caracterescadeias de caracteres encerradas por encerradas por ‘enter’‘enter’, fornecidas pelo operador, por meio do , fornecidas pelo operador, por meio do tecladoteclado
Cada umaCada uma dessas cadeias, ao ser digitada, irá dessas cadeias, ao ser digitada, irá preencherpreencher o buffer o buffer
scanfscanf vai lendo caracteres do buffer, para vai lendo caracteres do buffer, para formar valoresformar valores a serem armazenados nas a serem armazenados nas variáveis especificadas variáveis especificadas
Cada caractere lido é Cada caractere lido é eliminadoeliminado do buffer do buffer
Caso o buffer Caso o buffer fique vaziofique vazio durante a execução durante a execução de uma de uma chamadachamada dede scanfscanf e ainda haja e ainda haja valores a serem lidos valores a serem lidos na mesma chamadana mesma chamada: :
O computador deve O computador deve pararparar, esperando que o , esperando que o operador digite operador digite outra cadeiaoutra cadeia de caracteres de caracteres encerrada por encerrada por ‘enter’ ‘enter’
Para a formação de Para a formação de valores de determinados valores de determinados tipostipos, há necessidade de , há necessidade de converterconverter os os caracteres lidos em uma caracteres lidos em uma representação representação adequada de bitsadequada de bits
Exemplo:Exemplo: seja a formação de um valor para uma seja a formação de um valor para uma variável do tipo variável do tipo intint (formato (formato %d%d))
Supondo os seguintes caracteres lidos: Supondo os seguintes caracteres lidos: ‘-’‘-’, , ‘4’‘4’, , ‘1’‘1’, , ‘3’‘3’ e e ‘7’‘7’. .
Eles devem ser convertidos no número -Eles devem ser convertidos no número -41374137 binário em complemento de 2 de 4 bytes binário em complemento de 2 de 4 bytes
Esse valor será armazenado no local Esse valor será armazenado no local reservado para tal variávelreservado para tal variável
Exemplo:Exemplo: seja a formação de um valor para seja a formação de um valor para uma variável do tipo uma variável do tipo floatfloat (formato (formato %f%f) )
Supondo os seguintes caracteres lidos: Supondo os seguintes caracteres lidos: ‘2’‘2’, , ‘3’‘3’, , ‘.’‘.’, , ‘7’‘7’, , ‘5’‘5’ e e ‘2’‘2’
Eles devem ser Eles devem ser convertidosconvertidos no número no número binário mais próximo possível de binário mais próximo possível de 23.75223.752 em em ponto-flutuanteponto-flutuante de 4 bytes de 4 bytes
Esse valor será armazenado no local Esse valor será armazenado no local reservado para tal variávelreservado para tal variável
Forma geral das chamadas de scanf:Forma geral das chamadas de scanf:
scanf (CadeiaDeControle, scanf (CadeiaDeControle, OutrosArgumentos);OutrosArgumentos);
OutrosArgumentos: endereçosOutrosArgumentos: endereços das variáveis das variáveis que receberão os valores lidos, que receberão os valores lidos, convenientemente convertidosconvenientemente convertidos
Operador de Operador de endereçamentoendereçamento: o caractere : o caractere ‘&’‘&’
scanf (CadeiaDeControle, OutrosArgumentos);scanf (CadeiaDeControle, OutrosArgumentos);
CadeiaDeControle:CadeiaDeControle: cadeia de caracteres para cadeia de caracteres para gerenciar todo o processo de gerenciar todo o processo de leitura e conversãoleitura e conversão
Pode conter os mais Pode conter os mais variados tiposvariados tipos de de caracterescaracteres
No entanto, seus elementos No entanto, seus elementos principaisprincipais são os são os chamados chamados formatos de leituraformatos de leitura
Formatos de leitura:Formatos de leitura: sub-cadeias iniciadas pelo sub-cadeias iniciadas pelo caractere caractere ‘%’‘%’
Os Os outros caracteresoutros caracteres trazem informações sobre trazem informações sobre o o tipo de conversãotipo de conversão a ser realizada com os a ser realizada com os caracteres lidoscaracteres lidos
Exemplo:Exemplo: seja o seguinte trecho de programa seja o seguinte trecho de programa
char a, b; int n; float x; double y;char a, b; int n; float x; double y;
scanf (“%c%c%d%f%lf”, &a, &b, &n, &x, &y);scanf (“%c%c%d%f%lf”, &a, &b, &n, &x, &y);
Cadeia de controle:Cadeia de controle: “%c%c%d%f%lf”“%c%c%d%f%lf”
Outros argumentos: &a, &b, &n, &x, &yOutros argumentos: &a, &b, &n, &x, &y
Formato %c: Formato %c: leitura de um leitura de um caracterecaractere e sua conversão e sua conversão para para ASCIIASCII
Formato %d: Formato %d: leitura de leitura de dígitos decimaisdígitos decimais e sua e sua conversão para binário em conversão para binário em complemento de 2complemento de 2
Formatos %f e %lf: Formatos %f e %lf: leitura e conversão de leitura e conversão de números números reaisreais em forma em forma decimaldecimal ou ou exponencialexponencial, para , para ponto-ponto-flutuante de 4 e 8 bytesflutuante de 4 e 8 bytes respectivamente respectivamente
Tabela de formatos de leitura da Linguagem Tabela de formatos de leitura da Linguagem C:C:
O formato O formato %s%s usado para leitura de usado para leitura de cadeias cadeias de caracteresde caracteres será estudado com detalhes no será estudado com detalhes no capítulo sobre capítulo sobre variáveis indexadasvariáveis indexadas
Caracteres fora de formatos de leitura:Caracteres fora de formatos de leitura:
Na Na cadeia de controlecadeia de controle de uma chamada da de uma chamada da função função scanfscanf podem aparecer caracteres podem aparecer caracteres fora fora de formatosde formatos de leitura de leitura
Nesse caso, tais caracteres também devem Nesse caso, tais caracteres também devem aparecer no buffer do tecladoaparecer no buffer do teclado, senão a , senão a execução dessa chamada é execução dessa chamada é interrompidainterrompida
Exemplo:Exemplo: seja o seguinte trecho de programa seja o seguinte trecho de programa
char c = '#'; int i;char c = '#'; int i; printf ("Digite um numero inteiro e um printf ("Digite um numero inteiro e um
caractere:\n");caractere:\n");
scanf (scanf ("%d-----%c""%d-----%c", &i, &c);, &i, &c);
printf ("Numero digitado: %d", i);printf ("Numero digitado: %d", i);
printf ("\nCaractere digitado: %c", c);printf ("\nCaractere digitado: %c", c);Entre o número e o caractere pedidos devem ser digitados 5 caracteres ‘-’
Caso contrário, a execução será interrompida antes da leitura para a variável c
c continuará com seu valor anterior
Resultados:
Para entrada 37-----&:
Numero digitado: 37Caractere digitado: &
Para entrada 37---& ou 37--&--&:
Numero digitado: 37Caractere digitado: #
Caracteres fora de formatos de leitura:Caracteres fora de formatos de leitura:
Caso os caracteres fora desses formatos sejam Caso os caracteres fora desses formatos sejam espaços em branco (‘ ’)espaços em branco (‘ ’), as , as exigênciasexigências para a para a cadeia digitada são cadeia digitada são menores menores
Havendo na cadeia de controle uma sequência de Havendo na cadeia de controle uma sequência de um ou mais um ou mais espaços espaços em branco, em branco, nãonão é necessário é necessário introduzir na cadeia digitada uma introduzir na cadeia digitada uma sequência de sequência de espaçosespaços
Caso isso aconteça, tal sequência Caso isso aconteça, tal sequência nãonão precisa ser precisa ser do do mesmo tamanhomesmo tamanho daquela da cadeia de controle daquela da cadeia de controle
Esta característica pode ser usada para descartar Esta característica pode ser usada para descartar espaços em brancoespaços em branco e caracteres e caracteres <enter><enter> para a para a leitura de um caractereleitura de um caractere
Exemplo: Exemplo: eliminação da necessidade da variável eliminação da necessidade da variável lixolixo
#include <stdio.h>#include <stdio.h>
#include <stdlib.h>#include <stdlib.h>
int main () {int main () {
int n, q; char c;int n, q; char c;
printf ("Quadrado de um numero (s/n)? ");printf ("Quadrado de um numero (s/n)? ");
scanf ("%c", &c);scanf ("%c", &c);
while (c == 's' || c == 'S') {while (c == 's' || c == 'S') {
printf ("\n\tDigite o numero: ");printf ("\n\tDigite o numero: ");
scanf ("%d", &n);scanf ("%d", &n);
q = n * n;q = n * n;
printf ("\n\tQuadrado (%d) = %d", n, q);printf ("\n\tQuadrado (%d) = %d", n, q);
printf ("\n\nQuadrado de um numero (s/n)? ");printf ("\n\nQuadrado de um numero (s/n)? ");
scanf (" %c", &c);scanf (" %c", &c);
}}
printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;
}}
Antes de processar o %c, scanf lê e descarta todos os brancos e o <enter> do buffer do teclado
Não há necessidade de jogar o <enter> no lixo
Caracteres incompatíveis com formatos de Caracteres incompatíveis com formatos de leitura: provocam o encerramento da leitura: provocam o encerramento da execução de scanfexecução de scanf
Exemplo: Exemplo: seja o seguinte programaseja o seguinte programa
char c; int a;char c; int a;printf ("Digite uma sequencia de caracteres:\n");printf ("Digite uma sequencia de caracteres:\n");scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("\na = %d; c = %c\n", a, c);printf ("\na = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c", a, c);printf ("a = %d; c = %c", a, c);
123we x<enter>
Entrada a ser digitada
char c; int a;char c; int a;printf ("Digite cadeia de caracteres:\n");printf ("Digite cadeia de caracteres:\n");scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("\na = %d; c = %c\n", a, c);printf ("\na = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c", a, c);printf ("a = %d; c = %c", a, c);
Buffer do teclado
Vídeo
123we x<enter>
Entrada a ser digitada
ac
char c; int a;char c; int a;printf ("Digite cadeia de caracteres:\n");printf ("Digite cadeia de caracteres:\n");scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("\na = %d; c = %c\n", a, c);printf ("\na = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c", a, c);printf ("a = %d; c = %c", a, c);
123we x<enter>
Entrada a ser digitada
Buffer do teclado
Digite cadeia de caracteres:_
Vídeo
ac
char c; int a;char c; int a;printf ("Digite cadeia de caracteres:\n");printf ("Digite cadeia de caracteres:\n");scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("\na = %d; c = %c\n", a, c);printf ("\na = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c", a, c);printf ("a = %d; c = %c", a, c);
123we x<enter>
Entrada a ser digitada
Buffer do teclado
Digite cadeia de caracteres:_
Vídeo
ac
Buffer vazio
O operador digita a cadeia
char c; int a;char c; int a;printf ("Digite cadeia de caracteres:\n");printf ("Digite cadeia de caracteres:\n");scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("\na = %d; c = %c\n", a, c);printf ("\na = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c", a, c);printf ("a = %d; c = %c", a, c);
123we x<enter>
Buffer do teclado
Digite cadeia de caracteres: 123we x_
Vídeo
ac
Buffer vazio
O operador digita a cadeia
char c; int a;char c; int a;printf ("Digite cadeia de caracteres:\n");printf ("Digite cadeia de caracteres:\n");scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("\na = %d; c = %c\n", a, c);printf ("\na = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c", a, c);printf ("a = %d; c = %c", a, c);
123we x<enter>
Buffer do teclado
Digite cadeia de caracteres: 123we x_
Vídeo
ac
scanf processa %d, percorrendo o buffer
Elimina os 3 brancos
Lê “123” e encontra ‘w’ que é incompatível e para
Converte “123” para 123 binário e atribui à variável a
char c; int a;char c; int a;printf ("Digite cadeia de caracteres:\n");printf ("Digite cadeia de caracteres:\n");scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("\na = %d; c = %c\n", a, c);printf ("\na = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c", a, c);printf ("a = %d; c = %c", a, c);
we x<enter>
Buffer do teclado
Digite cadeia de caracteres: 123we x_
Vídeo
123ac
scanf processa %d, percorrendo o buffer
Elimina os 3 brancos
Lê “123” e encontra ‘w’ que é incompatível e para
Converte “123” para 123 binário e atribui à variável a
char c; int a;char c; int a;printf ("Digite cadeia de caracteres:\n");printf ("Digite cadeia de caracteres:\n");scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("\na = %d; c = %c\n", a, c);printf ("\na = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c", a, c);printf ("a = %d; c = %c", a, c);
we x<enter>
Buffer do teclado
Digite cadeia de caracteres: 123we x_
Vídeo
123ac
scanf processa %c
Encontra ‘w’ e o atribui à variável c
char c; int a;char c; int a;printf ("Digite cadeia de caracteres:\n");printf ("Digite cadeia de caracteres:\n");scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("\na = %d; c = %c\n", a, c);printf ("\na = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c", a, c);printf ("a = %d; c = %c", a, c);
e x<enter>
Buffer do teclado
Digite cadeia de caracteres: 123we x_
Vídeo
123awc
scanf processa %c
Encontra ‘w’ e o atribui à variável c
char c; int a;char c; int a;printf ("Digite cadeia de caracteres:\n");printf ("Digite cadeia de caracteres:\n");scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("\na = %d; c = %c\n", a, c);printf ("\na = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c", a, c);printf ("a = %d; c = %c", a, c);
e x<enter>
Buffer do teclado
Digite cadeia de caracteres: 123we x_
Vídeo
123awc
char c; int a;char c; int a;printf ("Digite cadeia de caracteres:\n");printf ("Digite cadeia de caracteres:\n");scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("\na = %d; c = %c\n", a, c);printf ("\na = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c", a, c);printf ("a = %d; c = %c", a, c);
e x<enter>
Buffer do teclado
Digite cadeia de caracteres: 123we x
a = 123; c = w_
Vídeo
123awc
char c; int a;char c; int a;printf ("Digite cadeia de caracteres:\n");printf ("Digite cadeia de caracteres:\n");scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("\na = %d; c = %c\n", a, c);printf ("\na = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c", a, c);printf ("a = %d; c = %c", a, c);
e x<enter>
Buffer do teclado
Digite cadeia de caracteres: 123we x
a = 123; c = w_
Vídeo
123awc
scanf processa %c
Encontra ‘e’ e o atribui à variável c
char c; int a;char c; int a;printf ("Digite cadeia de caracteres:\n");printf ("Digite cadeia de caracteres:\n");scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("\na = %d; c = %c\n", a, c);printf ("\na = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c", a, c);printf ("a = %d; c = %c", a, c);
x<enter>
Buffer do teclado
Digite cadeia de caracteres: 123we x
a = 123; c = w_
Vídeo
123aec
scanf processa %c
Encontra ‘e’ e o atribui à variável c
char c; int a;char c; int a;printf ("Digite cadeia de caracteres:\n");printf ("Digite cadeia de caracteres:\n");scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("\na = %d; c = %c\n", a, c);printf ("\na = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c", a, c);printf ("a = %d; c = %c", a, c);
x<enter>
Buffer do teclado
Digite cadeia de caracteres: 123we x
a = 123; c = w_
Vídeo
123aec
char c; int a;char c; int a;printf ("Digite cadeia de caracteres:\n");printf ("Digite cadeia de caracteres:\n");scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("\na = %d; c = %c\n", a, c);printf ("\na = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c", a, c);printf ("a = %d; c = %c", a, c);
x<enter>
Buffer do teclado
Digite cadeia de caracteres: 123we x
a = 123; c = wa = 123; c = e_
Vídeo
123aec
char c; int a;char c; int a;printf ("Digite cadeia de caracteres:\n");printf ("Digite cadeia de caracteres:\n");scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("\na = %d; c = %c\n", a, c);printf ("\na = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c", a, c);printf ("a = %d; c = %c", a, c);
x<enter>
Buffer do teclado
Digite cadeia de caracteres: 123we x
a = 123; c = wa = 123; c = e_
Vídeo
123aec
scanf processa %d, percorrendo o buffer
Elimina os 3 brancos
Encontra ‘x’ que é incompatível e para
scanf encerra sua execução
char c; int a;char c; int a;printf ("Digite cadeia de caracteres:\n");printf ("Digite cadeia de caracteres:\n");scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("\na = %d; c = %c\n", a, c);printf ("\na = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c", a, c);printf ("a = %d; c = %c", a, c);
x<enter>
Buffer do teclado
Digite cadeia de caracteres: 123we x
a = 123; c = wa = 123; c = e_
Vídeo
123aec
scanf processa %d, percorrendo o buffer
Elimina os 3 brancos
Encontra ‘x’ que é incompatível e para
scanf encerra sua execução
char c; int a;char c; int a;printf ("Digite cadeia de caracteres:\n");printf ("Digite cadeia de caracteres:\n");scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("\na = %d; c = %c\n", a, c);printf ("\na = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c", a, c);printf ("a = %d; c = %c", a, c);
x<enter>
Buffer do teclado
Digite cadeia de caracteres: 123we x
a = 123; c = wa = 123; c = e_
Vídeo
123aec
char c; int a;char c; int a;printf ("Digite cadeia de caracteres:\n");printf ("Digite cadeia de caracteres:\n");scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("\na = %d; c = %c\n", a, c);printf ("\na = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c", a, c);printf ("a = %d; c = %c", a, c);
x<enter>
Buffer do teclado
Digite cadeia de caracteres: 123we x
a = 123; c = wa = 123; c = ea = 123; c = e_
Vídeo
123aec
char c; int a;char c; int a;printf ("Digite cadeia de caracteres:\n");printf ("Digite cadeia de caracteres:\n");scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("\na = %d; c = %c\n", a, c);printf ("\na = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c", a, c);printf ("a = %d; c = %c", a, c);
x<enter>
Buffer do teclado
Digite cadeia de caracteres: 123we x
a = 123; c = wa = 123; c = ea = 123; c = e_
Vídeo
123aec
scanf processa %c
Encontra ‘x’ e o atribui à variável c
char c; int a;char c; int a;printf ("Digite cadeia de caracteres:\n");printf ("Digite cadeia de caracteres:\n");scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("\na = %d; c = %c\n", a, c);printf ("\na = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c", a, c);printf ("a = %d; c = %c", a, c);
<enter>
Buffer do teclado
Digite cadeia de caracteres: 123we x
a = 123; c = wa = 123; c = ea = 123; c = e_
Vídeo
123axc
scanf processa %c
Encontra ‘x’ e o atribui à variável c
char c; int a;char c; int a;printf ("Digite cadeia de caracteres:\n");printf ("Digite cadeia de caracteres:\n");scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("\na = %d; c = %c\n", a, c);printf ("\na = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c", a, c);printf ("a = %d; c = %c", a, c);
<enter>
Buffer do teclado
Digite cadeia de caracteres: 123we x
a = 123; c = wa = 123; c = ea = 123; c = e_
Vídeo
123axc
char c; int a;char c; int a;printf ("Digite cadeia de caracteres:\n");printf ("Digite cadeia de caracteres:\n");scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("\na = %d; c = %c\n", a, c);printf ("\na = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c", a, c);printf ("a = %d; c = %c", a, c);
<enter>
Buffer do teclado
Digite cadeia de caracteres: 123we x
a = 123; c = wa = 123; c = ea = 123; c = ea = 123; c = x_
Vídeo
123axc
char c; int a;char c; int a;printf ("Digite cadeia de caracteres:\n");printf ("Digite cadeia de caracteres:\n");scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("\na = %d; c = %c\n", a, c);printf ("\na = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%d%c", &a, &c);scanf ("%d%c", &a, &c);printf ("a = %d; c = %c\n", a, c);printf ("a = %d; c = %c\n", a, c);scanf ("%c", &c);scanf ("%c", &c);printf ("a = %d; c = %c", a, c);printf ("a = %d; c = %c", a, c);
<enter>
Buffer do teclado
Digite cadeia de caracteres: 123we x
a = 123; c = wa = 123; c = ea = 123; c = ea = 123; c = x_
Vídeo
123axc
A execução continua!
5.3.4 – Limpeza do buffer do teclado5.3.4 – Limpeza do buffer do teclado
Muitas vezes é desejável Muitas vezes é desejável esvaziar o buffer do esvaziar o buffer do tecladoteclado, antes da chamada de uma função que , antes da chamada de uma função que o utilizao utiliza
Retomando o exemplo dos quadrados: Retomando o exemplo dos quadrados: int n, q; char c;printf ("Quadrado de um numero (s/n)? ");scanf ("%c", &c);while (c == 's' || c == 'S') {
printf ("Digite o numero: ");scanf ("%d", &n);q = n * n;printf ("Quadrado (%d) = %d", n, q);printf ("\n\nQuadrado de um numero (s/n)? ");scanf ("%c", &c);
}
O <enter> permanece no buffer e será lido para a variável c
Poder-se-ia usar Poder-se-ia usar getchegetche em vez de em vez de scanfscanf, ou , ou usar a cadeia de controle usar a cadeia de controle “ %c”“ %c” mas há mas há situações em que isso não é possívelsituações em que isso não é possível
A função A função setbufsetbuf do do stdio.hstdio.h esvazia seu esvazia seu primeiro argumento, caso o segundo primeiro argumento, caso o segundo argumento seja a constante argumento seja a constante NULLNULLint n, q; char c;
printf ("Quadrado de um numero (s/n)? ");scanf ("%c", &c);while (c == 's' || c == 'S') {
printf ("Digite o numero: ");scanf ("%d", &n);q = n * n;printf ("Quadrado (%d) = %d", n, q);printf ("\n\nQuadrado de um numero (s/n)? ");setbuf (stdin, NULL); scanf ("%c", &c);
}
stdin é o buffer do teclado
Há também o método Há também o método força brutaforça bruta, que lê todos , que lê todos os caracteres do buffer do teclado até encontrar os caracteres do buffer do teclado até encontrar o o <enter><enter>::
A necessidade desse esvaziamento é grande, na A necessidade desse esvaziamento é grande, na leitura de leitura de cadeias de caracteres cadeias de caracteres (função (função getsgets))
int n, q; char c;printf ("Quadrado de um numero (s/n)? ");scanf ("%c", &c);while (c == 's' || c == 'S') {
printf ("Digite o numero: ");scanf ("%d", &n);q = n * n;printf ("Quadrado (%d) = %d", n, q);printf ("\n\nQuadrado de um numero (s/n)? ");while (getchar() != '\n'); scanf ("%c", &c);
}
5.3.5 – Valor retornado por scanf5.3.5 – Valor retornado por scanf
scanf scanf retorna o número de retorna o número de conversões bem conversões bem sucedidassucedidas pela execução de sua chamada pela execução de sua chamada
Exemplo: Exemplo: Seja o trecho de programa:Seja o trecho de programa:
int a = 1, b = 1, i;printf ("Digite 2 numeros inteiros: ");i = scanf ("%d%d", &a, &b);printf ("\n\ta = %d; b = %d\n", a, b);printf ("\n\tNumero de leituras: %d\n", i);
Resultados de 3 execuções