A maior rede de estudos do Brasil

Grátis
347 pág.
LINGUAGEM C

Pré-visualização | Página 24 de 50

 conjunto de nomes de variáveis, separados por 
vírgula, que serão lidos, onde cada nome de variável é precedido pelo operador &; 
e retorna: 
 um valor inteiro que representa o número total de caracteres lidos, em caso de 
sucesso – esse número pode ser igual ou menor que o número esperado de itens a 
serem lidos; 
 a contante EOF, em caso de erro da função. 
 
O valor de retorno da função scanf() permite identificar o funcionamento adequado da 
função. Foi visto que quando se quer ler dados formatados do teclado, usa-se a 
expressão_de_controle para especificar o formato de entrada dos dados que serão lidos. E 
que cada expressão de controle é precedida por um sinal de % e um código de controle deve ser 
especificado para cada variável a ser lida. 
A string da expressão_de_controle permite especificar mais características dos dados 
lidos além do formato. Essas características são opcionais e são: *, largura e modificadores. A 
ordem em que essas quatro características devem ser especificadas é a seguinte: 
 
%[*][largura][modificadores]código_de_controle 
 
Como a expressão_de_controle, cada uma dessas características possui um conjunto 
de valores pré-definidos e suportados pela linguagem. Observe nas seções seguintes, todos os 
valores suportados para cada uma das características de formatação possíveis. 
 
3.5.1. Expressão de Controle 
A função scanf() pode ser usada para ler virtualmente qualquer tipo de dado. A tabela 
abaixo mostra todos os tipos de entrada suportados pela linguagem C. Observe: 
 
96 
 
 
 
 
Código Descrição 
%c 
leitura de um caractere (char) – se uma largura diferente do 
valor 1 é especificada, a função lê o número de caracteres 
especificado na largura e os armazena em posições sucessivas de 
memória (array) do ponteiro para char passado como 
parâmetro; o caractere “\0” não é acrescentado no final 
%d 
leitura de um número inteiro (int) – o valor pode ser precedido 
pelo símbolo de sinal (+ ou -) 
%u leitura de um número inteiro sem sinal (unsigned int) 
%i 
leitura de um número inteiro (int) – o valor pode estar precedido 
de 0x ou 0X, se for hexadecimal, ou pode ser precedido de zero 
(0), se for octal 
%f, %e, 
%E, %g, %G 
leitura de um número real (float e double) – o valor pode ser 
precedido pelo símbolo de sinal (+ ou -), e/ou seguido pelos 
caracteres “e” ou “E” (notação científica) e/ou possuir o 
separador de ponto decimal 
%o 
leitura de um número inteiro (int) no formato octal (base 8) – o 
valor pode ou não estar precedido de zero (0) 
%x, %X 
leitura de um número inteiro (int) no formato hexadecimal (base 
16) – o valor pode ou não estar precedido de 0x ou 0X 
%s 
leitura de uma sequência de caracteres (string) até um caractere 
de nova linha “\n” ou espaço em branco seja encontrado 
 
A seguir, são apresentados alguns exemplos de como cada expressão de controle pode ser 
utilizada para ler determinado dado do teclado. 
 
Lendo os tipos básicos 
A linguagem C possui vários tipos de entrada que podem ser utilizados com os tipos 
básicos, ou seja, char (“%c” e “%d”), int (“%d” e “%i”), float e double (“%f”), e por fim array 
de char ou string (“%s”). Note que o tipo char pode ser lido do teclado por meio dos 
operadores “%c” e “%d”. Nesse caso, “%c” irá ler um caractere e armazená-lo na variável, 
enquanto “%d” irá ler um valor numérico e armazenar na variável o caractere correspondente da 
tabela ASCII. Abaixo, tem-se alguns exemplos de leitura dos tipos básicos: 
 
 
97 
 
 
 
1. #include <stdio.h> 
2. #include <stdlib.h> 
3. int main() 
4. { 
5. int n 
6. float f; 
7. double d; 
8. char letra; 
9. scanf("%d", &n); //leitura de int 
10. scanf("%i", &n); //leitura de int 
11. scanf("%d", &letra); //leitura de char 
12. scanf("%c", &letra); //leitura de char 
13. scanf("%f", &f); //leitura de float 
14. scanf("%f", &d); //leitura de double 
15. return 0; 
16. } 
 
Lendo valores no formato octal ou hexadecimal 
O exemplo abaixo mostra como ler um valor inteiro nos formatos octal (base 8) ou 
hexadecimal (base 16). Para isso, usamos a expressão de controle “%o” (sinal de porcentagem 
mais a letra “o”, não o zero “0”) para que a função scanf() leia o valor em octal, e “%x” para 
hexadecimal com letras minúsculas e “%X” para hexadecimal com letras maiúsculas. Observe: 
 
12. #include <stdio.h> 
13. #include <stdlib.h> 
14. int main() 
15. { 
16. int n; 
17. scanf("%o\n", &n); //leitura no formato octal 
18. scanf("%x\n", &n); //leitura no formato hexadecimal 
19. scanf("%X\n", &n); //leitura no formato hexadecimal 
20. return 0; 
21. } 
 
Lendo valores como notação científica 
De modo geral, podemos ler um valor em notação científica com qualquer um dos tipos de 
entrada habilitados para lerem valores de ponto flutuante (float e double): “%f”, “%e”, “%E”, 
“%g” e “%G”. Na verdade, esses tipos de entrada não fazem distinção na forma como o valor em 
ponto flutuante é escrito, desde que seja ponto flutuante, como mostrado no exemplo abaixo. 
Observe: 
 
1. #include <stdio.h> 
2. #include <stdlib.h> 
3. int main() 
98 
 
 
 
4. { 
5. float x; 
6. scanf(“%f”, &x); 
7. scanf(“%e”, &x); 
8. scanf(“%E”, &x); 
9. scanf(“%g”, &x); 
10. scanf(“%G”, &x); 
11. return 0; 
12. } 
 
Lendo uma string do teclado 
O exemplo abaixo mostra como ler uma string (ou array de caracteres) do teclado. Para 
isso, usamos o tipo de entrada “%s”. Note que quando usamos a função scanf() para ler uma 
string, o símbolo de & antes do nome da variável não é utilizado. Além disso, a função scanf() lê 
apenas strings digitadas sem espaços, ou seja, apenas palavras. No caso de ter sido digitada uma 
frase (uma sequência de caracteres contendo espaços em branco) apenas os caracteres digitados 
antes do primeiro espaço encontrado serão armazenados na string. 
Observe o exemplo abaixo: 
 
1. #include <stdio.h> 
2. #include <stdlib.h> 
3. int main() 
4. { 
5. char texto[20]; 
6. printf(“Digite uma palavra: “); 
7. scanf(“%s”, texto); 
8. return 0; 
9. } 
 
3.5.2. O Campo Asterisco (*) 
A função scanf() ignora apenas os espaços em branco entre os tipos de entrada. 
Qualquer outro caractere inserido entre os tipos de dados deverá ser digitado pelo usuário, mas 
será descartado pelo programa. Isso faz com que as duas chamadas da função abaixo possuam o 
mesmo efeito: ler dois valores de inteiro. 
 
int x, y; 
scanf(“%d%d”,&x,&y); 
scanf(“%d %d”,&x,&y); 
 
Porém, qualquer caractere que não seja um espaço em branco que for digitado junto ao 
tipo de entrada faz com que a função scanf() exija a leitura desse caractere e o descarte em 
99 
 
 
 
seguida. Isso é interessante quando queremos que seja feita a entrada de dados em uma 
formatação pré-determinada, como uma data. 
Por exemplo, “%d / %d / %d” faz com que a função scanf() leia um inteiro, uma barra 
(que será descartada), outro valor inteiro, outra barra (que também será descartada) e , por fim, o 
terceiro último inteiro. Entretanto, se o caractere a ser lido e descartado não é encontrado, a 
função scanf() irá terminar, sendo os dados lidos de maneira incorreta. 
Observe o exemplo abaixo: 
 
1. #include<stdio.h> 
2. #include<stdlib.h> 
3. int main() 
4. { 
5. int dia,mes,ano; 
6. printf(“Digite uma data no formato dd/mm/aaaa: “); 
7. scanf(“%d/%d/%d”, &dia,&mes,&ano); 
8. printf(“A data que você digitou foi: %d/%d/%d.\n”, dia,mes,ano); 
9. system(“pause”); 
10. return 0; 
11. } 
 
Isso permite que a função scanf() seja utilizada para receber dados formatados como, 
por exemplo, uma data. No exemplo acima, a função scanf() é usada para a entrada