Pergunta

Se eu quiser receber uma entrada de um caractere em C, como eu ia verificar se caracteres extras foram enviados, e em caso afirmativo, como eu iria limpar isso?

Existe uma função que funciona como getc (stdin), mas que não solicita ao usuário digitar um caractere, para que eu possa simplesmente colocar while(getc(stdin)!=EOF);? Ou uma função para espreitar o próximo caractere no buffer, e se ele não retornar NULL (ou o que estaria lá), eu poderia chamar uma função (nother) que libera stdin?

Editar

Então, agora, scanf parece estar fazendo o truque, mas há uma maneira de obtê-lo para ler o todo string, até a nova linha? Ao invés do espaço em branco mais próximo? Eu sei que posso apenas colocar "% s% s% s" ou o que quer na cadeia de formato, mas eu posso lidar com um número arbitrário de espaços?

Foi útil?

Solução

Você não pode liberar o fluxo de entrada. Você será invocando um comportamento indefinido se o fizer. Sua melhor aposta é para fazer:

int main() {
  int c = getchar();
  while (getchar() != EOF);
  return 0;
}

Para magia uso scanf:

#include <stdio.h>
#include <stdlib.h> 

#define str(s) #s
#define xstr(s) str(s)
#define BUFSZ 256

int main() {
  char buf[ BUFSZ + 1 ];
  int rc = scanf("%" xstr(BUFSZ) "[^\n]%*[^\n]", buf);
  if (!feof(stdin)) {
    getchar();
  }
  while (rc == 1) {
    printf("Your string is: %s\n", array);
    fflush(stdout);
    rc = scanf("%" xstr(LENGTH) "[^\n]%*[^\n]", array);
    if (!feof(stdin)) {
        getchar();
    }
   }
   return 0;
}

Outras dicas

Você pode usar getline para ler uma linha inteira de entrada.

Como alternativa (em resposta à sua pergunta original), você pode chamar select ou poll em stdin para ver se há personagens adicionais a serem lidas.

Eu tive um problema semelhante hoje, e eu encontrei uma maneira que parece funcionar. Eu não sei os detalhes da sua situação, então eu não sei se ele vai trabalhar para você ou não.

Eu estou escrevendo uma rotina que precisa ser um único caractere do teclado, e ele precisa ser uma das três combinações de teclas específicas ( '1', '2', ou um '3'). Se não for um desses, as necessidades do programa para enviar e mensagem de erro e loop de volta para mais uma tentativa.

O problema é que, além de o personagem que eu digite a ser devolvido pelo getchar (), a tecla 'Enter' (que envia a combinação de teclas para o programa) é salvo em um buffer de entrada. Que (não-impressão) de nova linha de caracteres é então devolvido pela instalação getchar () no circuito de correção de erros, resultando ainda em uma segunda mensagem de erro (uma vez que a nova linha de caracteres não é tanto um '1', '2' , nem um '3').

A questão é ainda mais complicada porque eu, por vezes, chegar à frente de mim mesmo e em vez de digitar um único caractere, eu vou entrar o nome do arquivo que uma dessas opções irá solicitar. Então eu tenho toda uma série de caracteres indesejados no buffer, resultando em uma longa lista de mensagens de erro de rolagem para baixo na tela.

Não se refrescar.

O que parece ter corrigido isso, porém, é o seguinte:

c = getchar();  // get first char in line
while(getchar() != '\n') ; // discard rest of buffer

A primeira linha é a única que realmente usa o personagem que eu entrar. A segunda linha dispõe de qualquer resíduo fica no buffer de entrada. É simplesmente cria um laço que puxa um carácter de cada vez a partir da memória intermédia de entrada. Não há nenhuma ação específica para ocorrer enquanto a instrução está looping. Ele simplesmente lê um personagem e, se não é uma nova linha, volta para a próxima. Quando encontra uma nova linha, as extremidades de loop e vai para a próxima ordem do dia no programa.

Nós podemos fazer uma função para limpar o buffer de teclado, como este:

#include <stdio.h>

void clear_buffer(){
   char b;
   //this loop take character by character in the keyboard buffer using 
   //getchar() function, it stop when the variable "b" was
   //enter key or EOF.
   while (((b = getchar()) != '\n') && (b != EOF));
}

int main()
{
    char input;
    //get the input. supposed to be one char!
    scanf("%c", &input); 
    //call the clearing function that clear the buffer of the keyboard 
    clear_buffer(); 
    printf("%c\n",input); //print out the first character input
    // to make sure that our function work fine, we have to get the
    // input into the "input" char variable one more time
    scanf("%c", &input); 
    clear_buffer();  
    printf("%c\n",input);
    return 0;
}

Use uma leitura que vai ter um monte de personagens (mais de 1, talvez 256), e ver quantos são realmente devolvido. Se você receber mais de um, você sabe; Se você só tem uma, é tudo o que havia disponível.

Você não mencionam plataforma, e isso fica bastante complicado muito rapidamente. Por exemplo, em Unix (Linux), o mecanismo normal retornará uma linha de dados - provavelmente o personagem que você após e uma nova linha. Ou talvez você convencer o seu usuário digite ^ D (default) para enviar o personagem anterior. Ou talvez você usar funções de controle para colocar o terminal em modo simples (como programas como o vi e emacs fazer).

No Windows, eu não tenho tanta certeza - Eu acho que é uma função getch() que faz o que você precisa

.

Por que você não usar scanf em vez de getc, usando scanf u pode obter a seqüência inteira.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top