2009-09-08 12 views
13

Sto imparando C e sto usando "getchar()" per fermare il comando windows così posso vedere gli esercizi che sto facendo ma semplicemente non funziona. heres un campione:Perché non getchar() mi aspetta per premere invio dopo scanf()?

#include <stdio.h> 

int main() 
{ 
    int value; 
    printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: "); 
    scanf("%d", &value); 
    switch (value) 
    { 
     case 1: 
      printf("you selected the option 1."); 
      break; 
     case 2: 
      printf("you selected the option 2."); 
      break; 
     case 3: 
      printf("you selected the option 3."); 
      break; 
     case 4: 
      printf("goodbye"); 
      break; 
     default: 
      printf("thats not an option"); 
      break; 
    } 
    getchar(); 
    return 0; 
} 

questo è l'output:

  1. opzione 1.
  2. opzione 2.
  3. opzione 3.
  4. Uscita.

Fai un'opzione: 1

è stata selezionata l'opzione 1.

processo restituito 0 (0x0) Tempo di esecuzione: 3.453 s

Premere un tasto qualsiasi per continuare.

Perché non attende l'input di "getchar()"?

+0

Vedi http://stackoverflow.com/questions/1384073/problem-with-flushing-input-stream-c/1384089. –

risposta

2

È possibile ottenere il ritorno a capo che si inserisce dopo l'1?

+0

Sì, getchar() sta ricevendo la newline che termina l'input, e quindi non attende molto da quando i dati sono già nei suoi buffer. –

+0

Heck se quello era sbagliato. Mi piace la risposta fflush e provarlo. –

+1

Abbastanza sicuro che quei ragazzi in gamba erano giusti. –

21

Il tuo scanf ha mangiato solo il numero, ma non la riga finale finale. Mettere una nuova riga o uno spazio vuoto dopo% d ti darà quindi il problema opposto, leggendo troppo lontano.

Questo è il motivo per cui alla gente non piace scanf.

Suggerirei di leggere una riga effettiva (utilizzare fgets(3)) e quindi utilizzare sscanf() per eseguire la scansione della stringa.

-9

per far funzionare il programma, è necessario "svuotare" il flusso di input prima di chiamare getchar() con una chiamata a fflush (stdin). Quello che fa è che quando digiti sulla tastiera un numero e poi la chiave di ritorno, il buffer di input ottiene entrambi i caratteri, ad esempio '1' e '\ n', e la tua chiamata a scanf ottiene solo '1' in modo che ' \ n 'rimane nel buffer di input. Quando chiami getchar, stai "gettando" quel restante "\ n". Flushing the input scarta tutto il buffer.

+3

'fflush (stdin)' è un comportamento _undefined_. Non farlo –

+0

allora come dovrei farlo? sono davvero nuovo per questo, vengo da Python come il mio primo linguaggio di programmazione quindi tutto sulla gestione della memoria è cinese per me .. –

+1

wow .. non sapevo .. ho appena fatto qualche ricerca e ho trovato questa spiegazione http: // www.gidnetwork.com/b-57.html – nairdaen

2

Il getchar() è la lettura del \ n dalla tastiera in scanf - vedi here per ulteriori informazioni

1

ti penso inserire un INVIO dopo inserendo "1". Sarà accettato dal getchar(). Così puoi risolvere il problema semplicemente aggiungendo un ulteriore getchar() dopo quello originale (poco prima dello return 0;).

** Ho provato questo e ha funzionato.

8

Prima di tutto, fare non utilizzare fflush() per cancellare un flusso di input; il comportamento non è definito:

7.19.5.2.2 Se il flusso punta a un flusso di uscita o ad un flusso di aggiornamento in cui non è stata immessa l'operazione più recente , la funzione fflush causa la consegna di dati non scritti per quel flusso all'ambiente host da scrivere sul file; in caso contrario, il comportamento è indefinito.

Il problema è che il newline finale non viene consumato dal "% d" indicatore di conversione, pertanto sono stati prelevati immediatamente dal getchar(). Non esiste un modo migliore per affrontarlo, ma in genere l'approccio è di leggere l'intera riga come testo (utilizzando fgets() o scanf() con uno specifico identificatore di conversione "% s"), che consumerà la nuova riga, quindi convertirà l'obiettivo tipo di dati utilizzando sscanf() o strtol() o strtod().

-2
#include <stdio.h> 
#include<conio.h> 
void main() 
{ 
    int value; 
    printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: "); 
    scanf("%d", &value); 
    switch (value) 
    { 
     case 1: 
      printf("you selected the option 1."); 
      break; 
     case 2: 
      printf("you selected the option 2."); 
      break; 
     case 3: 
      printf("you selected the option 3."); 
      break; 
     case 4: 
      printf("goodbye"); 
      break; 
     default: 
      printf("thats not an option"); 
      break; 
    } 
    getch(); 
} 
+0

Quindi, la tua risposta è usare 'getch', invece? Potresti renderlo più chiaro (se è davvero così)? –

2

si stanno ottenendo un ritorno a capo, il modo in cui mi sarei intorno ad esso, definire un char e basta che la scansione il ritorno a capo,

char ch; (prima del tuo getch() inserire il seguente) scanf("%c",&ch); getchar();

dovrebbe funzionare in questo modo, non il modo più efficiente per farlo ma funziona per me.

1

Come già accennato, scanf lascia \ n indietro dopo aver letto l'input dell'utente.

Soultion: aggiungere getchar() subito dopo scanf.

Questo compensa l'insufficienza di scanf.

cioè

int value; 
printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: "); 
scanf("%d", &value); 
getchar(); 
switch (value) 
Problemi correlati