.Ler valores do teclado (função scanf) |
Retomando o exemplo que serviu de ilustração para mostrar como escrever no ecrã, vamos agora ver como introduzir valores durante a execução do programa :
A função usada para efectuar a leitura de valores é a função scanf. Está definida na biblioteca stdio.h, este ficheiro deve portanto ser incluido no inicio do programa. Para ler um valor de tipo double e coloca-lo na variável peso basta :
O primeiro argumento ("%f") é a cadeia de controlo. Define o tipo do valor que vai ser lido. Para ler um valor inteiro usa-se %d por exemplo para perguntar ao utilizador a sua idade podemos fazer:
Um pormenor pode parecer estranho : o nome da variável é precedido do símbolo &. Porquê ??? & é um operador em C que dá a posição em memória da variável que segue. Esta explicação é talvez nebulosa (é de proposito) porque ainda não vimos matéria suficiente para divulgar mais pormenores. Felizmente não é preciso saber mais, basta lembrar-se que na função scanf, o nome das variáveis é precedido do operador &.
É possivel ler vários valores com uma só chamada à função scanf :
Os valores que scanf é capaz ler são : inteiros (%d), float ou double (%f), caracteres (%c) e cadeias de caracteres (%s).
scanf, deve preceder os nomes das variáveis do operador &.A função scanf é muitas vezes na origem de erros. Se o seu programa der resultados errados, deve sempre verificar que os valores lidos são os valores esperados. Para isso não hesite em acrescentar uma instrução printf que mostra os valores lidos no ecrã.
O exemplo seguinte ilustra um problema frequentemente encontrado com a função scanf :
O programa não parou após ter perguntado pelo sexo, continuou até o fim imprimindo os valores das duas outras variáveis. O que é que aconteceu ? Para perceber temos que entende o que faz a função scanf. A função lê uma sequência de carateres e converte a sequência num valor inteiro, float ou char antes de o colocar na variável. Ao fazer isso
23»), o resultado será o mesmo.scanf lê apenas os caracteres necessários à conversão. Se por exemplo entrar 1.70a em vez de 1.70, o programa deixará o caracter 'a' na memória de entrada e quando, no scanf seguinte tentará ler um char colocara o caracter 'a' na variavel sexo.'1', '.', '7', '0' e o caracter 'return'. É este 'return' que ficou na memória de entrada e que foi colocado na variável sexo. O efeito visivel para o utilizador é que o programa não parou para deixar entrar o valor. Como resolver este problema ?O remédio consiste em introduzir um espaço na cadeia de controlo. Este espaço obriga o scanf a ignorar todos os caracteres brancos (espaços, TAB, return). A linha 13 do programa deve ser substituida por :
scanf significa muitas vezes que a memória de entrada está preenchida com caracteres que sobraram de um scanf anterior. Se esses caracteres são «brancos» pode resolver o problema colocando um espaço na cadeia de controlo.Q: Então porque é que o mesmo problema não ocoreu na leitura da altura ? Onde é que ficou o caracter 'enter' que foi introduzido a seguir ao 23 ?
R: Quando o scanf vai ler a altura, está a espera de um dígito, '+' ou '-'. Vai ignorar todos os caracteres brancos que aparecem antes. Mas quando lê um valor de tipo char, o valor pode ser um caracter qualquer inclusive um espaço. Neste caso o scanf não ignora nenhum caracter.