Non riesco a svuotare lo stdin

Come lavare lo stdin ??

Perché non funziona nel seguente snippet di codice?

#include  #include  #include  #include  int main() { int i=0,j=0, sat; char arg[256]; char * argq; argq = malloc(sizeof(char)*10); printf("Input the line\n"); i=read(0, arg, sizeof(char)*9); arg[i-1]='\0'; fflush(stdin); i=read(0, argq, sizeof(char)*5); argq[i-1]='\0'; puts(arg); puts(argq); return 0; } 

Ora se fornisco l’input come 11 caratteri, solo 9 dovrebbero essere letti, ma i rimanenti due caratteri nello stdin non vengono scaricati e riletti nell’argq. Perché?

Input: 123 456 789

Uscita: 123 456 89

Perché sto ottenendo questo 89 come uscita?

Credo che fflush sia usato solo con i flussi di output.

Potresti provare fpurge o __fpurge su Linux. Si noti che la pulizia è non standard e non portatile. Potrebbe non essere disponibile per te.

Da una pagina man di fpurge di Linux : in genere è un errore voler eliminare i buffer di input.

La soluzione più portabile per il flushing di stdin sarebbe probabilmente qualcosa del tipo:

 int c; while ((c = getchar()) != '\n' && c != EOF); 

Dalle domande frequenti su comp.lang.c, vedere:

  • Come posso svuotare l’input in sospeso in modo che il typeahead di un utente non venga letto al prompt successivo? Fflush (stdin) funzionerà?
  • Se fflush non funziona, cosa posso usare per scaricare l’input?
 int c; while((c = getchar()) != '\n' && c != EOF); 

È come cancellare il buffer di input.

Come lavare lo stdin ??

Flusso dei flussi di input sta invocando il comportamento non definito. Non provarlo

È ansible solo svuotare i flussi di output.

Stai sovrascrivendo l’ultimo elemento dell’input in arg con '\0' . Quella linea dovrebbe essere arg[i]='\0'; invece (dopo l’errore e il controllo dei confini ti manca).

Altri hanno già commentato la parte del lavaggio.

In Windows è ansible utilizzare la funzione di riavvolgimento (stdin) .

Non è ansible pulire stdin in Linux senza imbattersi in scenari in cui il comando verrà avviato in attesa dell’input in alcuni casi. Il modo per risolverlo è sostituire tutto std :: cin con readLineToStdString ():

 void readLine(char* input , int nMaxLenIncludingTerminatingNull ) { fgets(input, nMaxLenIncludingTerminatingNull , stdin); int nLen = strlen(input); if ( input[nLen-1] == '\n' ) input[nLen-1] = '\0'; } std::string readLineToStdString(int nMaxLenIncludingTerminatingNull) { if ( nMaxLenIncludingTerminatingNull <= 0 ) return ""; char* input = new char[nMaxLenIncludingTerminatingNull]; readLine(input , nMaxLenIncludingTerminatingNull ); string sResult = input; delete[] input; input = NULL; return sResult; } 

Ciò consentirà anche di inserire spazi in std :: cin string.