2012-11-14 12 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; 
} 

Wyjście wygląda toscanf nie poprosi o wejściu po raz drugi

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 

Drugie wejście zostało pominięte. Czemu?

+0

To zostało omówione milion razy na SO. Spróbuj trochę zbadać istniejące pytania. – fayyazkl

Odpowiedz

3

Z tego powodu zwykle nie jest preferowane ustawienie scanf do wprowadzania znaków. Po poprzednim wprowadzeniu następuje powrót po powrocie karetki.

Na przykład, jeśli po wprowadzeniu zamówienia dodano element getchar(), problem został rozwiązany, ale to nie jest czysty kod. Możesz to również zobaczyć jawnie, zamieniając cont != 'y' na cont != '\n'.

Zamiast używać getchar() za wszystkie wejścia i sprawdzić \ n

+0

Dobra, spróbuję tego trochę. Ale próbowałem 'fgets (..)' i to też cierpi i powinno być bezpieczniej. – user1012451

+0

Znowu fgets zawiera znak końca linii. Przed wpisaniem wartości wystarczy zamienić znak nowej linii na wartość null – John

3

Po scanf("%d", &order); zużywa numer (45 w tym przypadku), wciąż jest znak nowej linii w lewo po tym. Możesz użyć numeru scanf("%d\n", &order), aby uzyskać zwrot.

Inną odpowiedzią na ten temat można znaleźć tutaj:

scanf() leaves the new line char in buffer?

1

Dla większości konwersji scanf pominie spacje, ale dla formatu Char („% c”), należy pominąć spacje za pomocą wyraźnego miejsca w formacie („% c”), jak wyjaśniono tutaj:

C - trying to read a single char

to również wyjaśnione w dokumentacji scanf, ale to jest mylące i może być lepiej użyć czegoś e Podobnie jak wspomnieli inni.

1

Można użyć fflush()

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

ponieważ charakter nowej linii już w stdin, to się dzieje. używać

scanf(" %c", &cont); 

zamiast

scanf("%c", &cont); 

uwaga jedno miejsce przed% c.