2013-07-24 17 views
6

Jestem początkujący w C. Proszę nie zwracać uwagi, jeśli moje pytanie jest lame. W tym programie, który napisałem, kiedy używam pętli "for" po raz pierwszy, oczekuję, że tylko 3 wartości są przechowywane w tablicy, ale przechowuje 4 wartości, aw następnej pętli "for", jak oczekiwano, pokazują 3 wartości. Moje pytanie brzmi: dlaczego w pierwszej pętli "dla" zajmuje 4 wartości zamiast 3?Przechowuj dane w tablicy z wejścia

#include<stdio.h> 
void main() 
{ 
    int marks[3]; 
    int i; 

    for(i=0;i<3;i++) 
    { 
     printf("Enter a no\n"); 
     scanf("%d\n",(marks+i)); 
    } 
    for(i=0;i<3;i++) 
    { 
     printf("%d\n",*(marks+i)); 
    } 
} 
+2

'void main' nie jest legalne. Użyj 'int main'. – chris

+4

usuwa '\ n' w scanf –

Odpowiedz

11

\n w scanf był problem

#include<stdio.h> 
int main() 
{ 
    int marks[3]; 
    int i; 

    for(i=0;i<3;i++) 
    { 
     printf("Enter a no\n"); 
     scanf("%d",(marks+i)); 
    } 

    printf("\nEntered values:\n"); 
    for(i=0;i<3;i++) 
    { 
     printf("%d\n",*(marks+i)); 
    } 

    return 0; 
} 

Powód:

Oczekuję tylko 3 wartości są przechowywane w tablicy, ale przechowuje 4 wartości iw przyszłym " dla 'pętli zgodnie z oczekiwaniami pokaż 3 wartości. Moje pytanie brzmi: dlaczego w pierwszej pętli "dla" zajmuje 4 wartości zamiast 3?

pierwsze: Nie, to tylko liczba sklepów 3 ale nie 4 liczby w tablicy marks[].

Po drugie: Ciekawe, aby zrozumieć, że pętla działa tylko trzy razy dla i = 0 do i < 3. Pętla for działa zgodnie z warunkiem. Bardziej interesujące kod tkwi w scanf() jak opisano poniżej:

Twój zamieszanie dlatego trzeba wprowadzić cztery cyfry, to nie dlatego, że pętla jest 4 razy, ale jego ponieważ scanf() funkcja zwraca tylko po wpisaniu char bez spacji (i po wprowadzeniu wprowadź numer symbolu, który nie jest znakiem spacji).

Aby zrozumieć ten problem czytać podręcznik: int scanf(const char *format, ...);:

Sekwencja białe znaki (spacja, tabulacjami, itp .; patrz isspace(3)). Ta dyrektywa dopasowuje dowolną liczbę białych znaków, , w tym brak, na wejściu.

Ponieważ w pierwszej pętli dla użytkownika, w scanf() zostały zawarte \n w ciągu formatu, więc jeśli tylko scanf() powraca naciśnij numer wprowadzić (lub nie-przestrzeni klucz).

scanf("%d\n",(marks+i)); 
     ^
      | 
      new line char 

Co się dzieje?

Załóżmy wejście do programu to:

23  <--- because of %d 23 stored in marks[0] as i = 0 
<enter> <--- scanf consumes \n, still in first loop 
543  <--- scanf returns, and leave 542 unread, 
           then in next iteration 543 read by scanf in next iteration 
<enter> 
193 
<enter> <--- scanf consumes \n, still in 3rd loop 
<enter> <--- scanf consumes \n, still in 3rd loop 
123  <--- remain unread in input stream 
+0

thanx DX, ale gdy użyłem \ n po% d w scanf, to przyjmuje 2 wartości za pierwszym razem, gdy wartość i wynosi 0, ale gdy wartość i zmienia się w 1 i 2, zajmuje to tylko 1, dlaczego to się stało? – ranaarjun

+1

proszę przejść przez ten http://answers.yahoo.com/question/index?qid=20110801122000AA07FO8 nadzieję, że to daje dokładny powód –

+1

@GrijeshChauhan na pewno będzie to pomocne dla wszystkich :) Proszę zrobić –

0

usunąć \n i i mogą być tworzone w if jako for (int i = 0; i < 3; i++) {}