2013-01-31 10 views
5

Jestem początkujący w C, więc proszę wybaczyć, jeśli to pytanie jest głupie lub pytał dziwnie.Dlaczego drukowany jest printf po sprawdzeniu prawdziwego warunku?

Czytam C starter plusa i jeden z przykładów w Rozdział-8 jest jakaś pętla że testuje czy użytkownik wszedł - a newline character or not, którego nie mogłem zrozumieć.

Kod jest krótkie, więc pokażę ci to:

int main(void) 
{ 
    int ch; /* character to be printed */ 
    int rows, cols; /* number of rows and columns */ 
    printf("Enter a character and two integers:\n"); 
    while ((ch = getchar()) != '\n') 
    { 
     if (scanf("%d %d",&rows, &cols) != 2) 
      break; 
     display(ch, rows, cols); 
     while (getchar() != '\n') 
      continue; 
     printf("Enter another character and two integers;\n"); 
     printf("Enter a newline to quit.\n"); 
    } 
    printf("Bye.\n"); 
    return 0; 
} 
void display(char cr, int lines, int width) // the function to preform the printing of the arguments being passed 

Co ja nie rozumiem, jest tutaj:

while (getchar() != '\n') 
       continue; 
      printf("Enter another character and two integers;\n"); 
      printf("Enter a newline to quit.\n"); 

Przede wszystkim while (getchar() != '\n') testuje pierwszy ch było wprowadziłeś w prawo? Po drugie, jeśli to prawda, to dlaczego kontynuacja nie przeskakuje instrukcji printf i idzie do pierwszej chwili? czy to nie to, co powinien zrobić?

Tnx

+1

"Czytam C primer plus" <--- To jest twój największy problem !! Zabij tę książkę ogniem !!! RTFN –

+3

"Kontynuuj" to po prostu dym. Lepiej być 'while while (getchar()! = '\ N');'. –

+0

Dziękuję za wiele :) @Daniel Fischer – MNY

Odpowiedz

7

Ponieważ istnieje bez nawiasów klamrowych po instrukcji while, tylko następna linia jest zawarta w pętli. Tak więc continue kontynuuje pętlę while, aż zostanie znaleziony znak nowego wiersza, a następnie wykonywanie będzie kontynuowane w instrukcjach printf.

Jest to odpowiednik tego:

while (getchar() != '\n') 
{ 
    continue; 
} 
+2

+1 za dotarcie do prawdziwego problemu osoby pytającej tutaj. – HWende

+0

wielkie dzięki za odpowiedź! ale mimo to, jeśli kompilator zobaczy funkcję getchar(), zatrzyma się i poprosi o wpisanie znaku, następnie przetestuje go, a następnie kontynuuje ... więc to getchar() w czasie testuje poprzednie wejś[email protected] SShaheen – MNY

+1

@Nir Podczas gdy w buforze wejściowym nadal jest niepotrzebne wejście, 'getchar()' odczytuje znak z bufora. Zwykle dane wejściowe z 'stdin' są wysyłane do programu dopiero po naciśnięciu klawisza Return/Enter, a zatem zawsze znajdzie się znak nowej linii w buforze dla' getchar() ', aby ostatecznie znaleźć. Jeśli nie ma niepotrzebnego wejścia w buforze, a strumień nie jest zamknięty lub uszkodzony, blokuje się 'getchar()' dopóki nie zostanie dostarczone wejście do bufora. –

1

continue jest stosowana do while tuż przed nimi printf -s więc kiedy wchodzi \n dostaniesz z najbardziej wewnętrznej natomiast z powrotem do linii

printf("Enter another character and two integers;\n"); 
0

continue dotyczy najbliższego while pętli.

while (stuff) 
    continue; 

jest taka sama jak

while (stuf); 

(Uwaga średnik).

Po prostu mówisz "utrzymuj pętlę, aż warunek stanie się fałszywy".

0

Tutaj pętla while() jest związana tylko z instrukcją continue. Więc nie ma związku z instrukcjami printf ..........

Powiązane problemy