Conteúdo sobre leitura de inputs.
Em alguns problemas o input é passado de forma peculiar e muitas vezes é difícil fazer a leitura. Esta apostila oferece algumas dicas de como utilizar as funções do C/C++ para facilitar a leitura. Para mais informações clique em "Files" no fim da página e veja uma apostila sobre este assunto.
Funções
scanf
Função de leitura da entrada padrão (geralmente teclado). Algumas características importantes:
- Retorna o número de variáveis que conseguiu ler.
- Retorna EOF caso não conseguiu ler nada.
- Colocar um caractere espaço antes da variável faz a scanf ignorar todos espaços antes da variável. Ex: scanf(" %d"… . Ignora todos os espaços digitados antes do número (se tiver algum).
- Lê uma string até achar um espaço ou '\n' ou '\r' ou fim de arquivo. Como exemplo vejamos o código quando o usuário digita "Palavra1 Palavra2":
printf("Digite uma frase: "); numLidos = scanf(" %s", frase); printf("Foi lido %d variável.\n", numLidos); printf("Frase = %s\n", frase);
Resultado do código acima:
Digite uma frase: Palavra1 Palavra2
Foi lido 1 variável.
Frase = Palavra1
- Para ler uma linha inteira utilizar [^\n], segue um exemplo:
printf("Digite uma frase: "); numLidos = scanf(" %[^\n]\n", frase); printf("Foi lido %d variável.\n", numLidos); printf("Frase = %s\n", frase);
Resultado do código acima:
Digite uma frase: Palavra1 Palavra2
Foi lido 1 variável.
Frase = Palavra1 Palavra2
- Para saber quantos caracteres foram lidos utilize %n. Exemplo:
printf("Digite um numero: "); numLidos = scanf(" %d%n", &num, &k); printf("k = %d\n", k); printf("Foi lido %d variável.\n", numLidos);
Digite um numero: 1111
k = 4
Foi lido 1 variável.
- Para ignorar uma variável utilize %*tipo. Exemplo:
printf("Vai ler somente o segundo numero: "); scanf(" %*d %d", &n); printf("Numero lido = %d\n", n);
Vai ler somente o segundo numero: 1 2
Numero lido = 2
gets
Função que lê uma linha inteira da entrada padrão e guarda em uma string. Exemplo:
printf("Digite uma frase: "); gets(frase); printf("Frase = %s\n", frase);
Resultado do código acima:
Digite uma frase: Palavra1 Palavra2
Frase = Palavra1 Palavra2
- Não ignora espaços antes da string.
- Cuidado esta função não ignora o caractere '\r'.
ATENÇÃO: As funções gets e scanf não podem ser utilizadas juntas em um mesmo programa.
sscanf
Mesma que a scanf porém lê os dados de uma string e não da entrada padrão. Exemplo:
sscanf(linha, " %d", &num);
- Mesmas regras para scanf valem.
Quando e como usar as funções?
Na maioria dos casos a scanf já basta, porém uns problemas podem ter entradas pouco convencionais e exigirem um esforço maior de leitura de input.
- Ler uma linha com N números (não sabemos o valor de N).
gets(buf); // ou scanf(" %[^\n]\n", buf) int p = 0, n, k; // p é um apontador de onde estamos na string buf while (sscanf(buf + p, " %d%n", &n, &k) == 1) { // faz alguma coisa com n p += k; }