\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
'void main' nie jest legalne. Użyj 'int main'. – chris
usuwa '\ n' w scanf –