2012-11-14 10 views
6
#include "stdio.h" 

int main(void) 
{ 

    int order, nextp, N=3; 
    char cont; 
    nextp = 0; 
    printf("\nShould we continue (y or n): "); 
    scanf("%c", &cont); 
    if (cont != 'y') return; 
    for(; nextp < N; nextp++) 
    { 
     printf("Enter order number: "); 
     scanf("%d", &order); 
     printf("you have entered %d\n", order); 
     printf("okay now continue with cont\n"); 


     printf("enter cont y or n: "); 
     scanf("%c", &cont); 
     if (cont != 'y') 
     { 
      printf("\nnot equal to y\n"); 
      break; 
     } 
     printf("after intepreting t[0]"); 
     } 

    return 0; 
} 

L'output è simile al seguentescanf non chiederà di ingresso la seconda volta

Should we continue (y or n): y 
Enter order number: 45 
you have entered 45 
okay now continue with cont 
enter cont y or n: 
not equal to y 

La seconda voce è stata saltata. Perché?

+0

Questo è stato discusso un miliardo di volte su SO. Prova a fare un po 'di ricerca sulle domande esistenti – fayyazkl

risposta

3

Questo è il motivo per cui scanf non è in genere preferito per l'immissione di caratteri. C'è un ritorno a capo sinistro dopo l'input precedente.

Ad esempio, se si aggiungesse un getchar() dopo l'immissione dell'ordine, il problema verrà risolto, ma non si tratta di codice pulito. Puoi anche vederlo esplicitamente sostituendo lo cont != 'y' in cont != '\n'.

Invece, utilizzare getchar() per tutti i vostri input e verificare la presenza di \ n

+0

Ok, ci proverò un po'. Ma ho provato 'fgets (..)' e soffre anche lui e doveva essere più sicuro. – user1012451

+0

Anche in questo caso, fgets include la nuova riga alla fine. Basta sostituire la nuova riga con un valore null prima di immettere il valore – John

3

Dopo scanf("%d", &order); consuma il numero (45 in questo caso), c'è ancora una nuova riga a sinistra dopo. È possibile utilizzare scanf("%d\n", &order) per farlo consumare il reso.

Un'altra risposta a questa può essere trovato qui:

scanf() leaves the new line char in buffer?

1

Per la maggior parte delle conversioni scanf salterà spazio bianco, ma per il formato char ("% c") è necessario passare uno spazio bianco, utilizzando uno spazio esplicito nel formato ("% c") come spiegato qui:

C - trying to read a single char

Questo si spiega anche nella documentazione scanf, ma è confuso e potrebbe essere meglio usare qualcosa e lse come altri hanno menzionato.

1

È possibile utilizzare fflush()

printf("enter cont y or n: "); 
fflush(stdin); 
scanf("%c", &cont); 
8

a causa del carattere di nuova riga già in stdin, questo sta accadendo. utilizzare

scanf(" %c", &cont); 

invece di

scanf("%c", &cont); 

nota uno spazio prima% c.

Problemi correlati