Entradas Exóticas

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;
}
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License