Domanda

Se desidero ricevere un input di un carattere in C, come verificherei se sono stati inviati caratteri extra e, in tal caso, come lo cancellerei?

Esiste una funzione che si comporta come getc (stdin), ma che non richiede all'utente di inserire un carattere, quindi posso solo inserire while(getc(stdin)!=EOF);? O una funzione per sbirciare il prossimo carattere nel buffer, e se non restituisce NULL (o qualunque cosa ci sarebbe), potrei chiamare una funzione (altro) che scarica lo stdin?

Modifica

Quindi adesso scanf sembra fare il trucco ma c'è un modo per farlo leggere la stringa intera , fino alla nuova riga? Piuttosto che allo spazio bianco più vicino? So di poter inserire & Quot;% s% s% s & Quot; o qualsiasi altra cosa nella stringa di formato, ma posso gestire un numero arbitrario di spazi?

È stato utile?

Soluzione

Non è possibile scaricare il flusso di input. Se lo fai, invocherai un comportamento indefinito. La tua scommessa migliore è fare:

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

Per usare scanf magia:

#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;
}

Altri suggerimenti

Puoi usare getline per leggere un'intera riga di input.

In alternativa (in risposta alla domanda originale), puoi chiamare select o poll su stdin per vedere se ci sono altri caratteri da leggere.

Oggi ho avuto un problema simile e ho trovato un modo che sembra funzionare. Non conosco i dettagli della tua situazione, quindi non so se funzionerà per te o meno.

Sto scrivendo una routine che deve ottenere un singolo carattere dalla tastiera e deve essere uno dei tre tasti specifici (un '1', un '2' o un '3'). Se non è uno di questi, è necessario che il programma invii un messaggio di errore e ritorni indietro per un altro tentativo.

Il problema è che, oltre al carattere che inserisco, viene restituito da getchar (), la sequenza di tasti 'Invio' (che invia la sequenza di tasti al programma) viene salvata in un buffer di input. Quel carattere newline (non stampabile) viene quindi restituito dalla funzione getchar () nel ciclo di correzione degli errori, risultando ulteriormente in un secondo messaggio di errore (poiché il carattere newline non è né un "1", un "2" , né un "3".)

Il problema è ulteriormente complicato perché a volte vado avanti di me stesso e invece di inserire un singolo carattere, inserirò il nome file richiesto da una di queste opzioni. Quindi ho un'intera serie di caratteri indesiderati nel buffer, risultante in un lungo elenco di messaggi di errore che scorrono lungo lo schermo.

Non eccezionale.

Ciò che sembra averlo corretto, tuttavia, è il seguente:

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

La prima riga è quella che utilizza effettivamente il carattere che ho inserito. La seconda riga elimina qualsiasi residuo rimasto nel buffer di input. Crea semplicemente un ciclo che estrae un carattere alla volta dal buffer di input. Non è stata specificata alcuna azione da eseguire mentre l'istruzione è in loop. Legge semplicemente un personaggio e, se non è una nuova riga, torna indietro per il prossimo. Quando trova una nuova riga, il ciclo termina e passa al prossimo ordine di attività nel programma.

Possiamo creare una funzione per cancellare il buffer della tastiera, in questo modo:

#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;
}

Usa una lettura che richiederà molti caratteri (più di 1, forse 256) e vedi quanti vengono effettivamente restituiti. Se ne ottieni più di uno, lo sai; se ne ottieni solo uno, è tutto ciò che era disponibile.

Non menzioni la piattaforma, e questo diventa piuttosto complicato abbastanza rapidamente. Ad esempio, su Unix (Linux), il normale meccanismo restituirà una riga di dati, probabilmente l'unico carattere che stavi cercando e una nuova riga. O forse persuadi il tuo utente a digitare ^ D (impostazione predefinita) per inviare il carattere precedente. O forse usi le funzioni di controllo per mettere il terminale in modalità raw (come programmi come vi e emacs do).

Su Windows, non ne sono così sicuro - penso che ci sia una funzione getch() che fa quello che ti serve.

Perché non usi scanf invece di getc, usando scanf puoi ottenere l'intera stringa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top