\n
nel scanf
era il problema
#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;
}
Motivo:
mi aspetto solo 3
valori vengono memorizzati in un array, ma resteranno memorizzati 4 valori e nel prossimo ' per 'loop come previsto mostra 3 valori. La mia domanda è perché in 1 ° ciclo "per" richiede 4 valori invece di 3?
Primo: No, è solo negozi 3
numero, ma non 4
numeri in serie marks[]
.
Secondo: interessante capire ciclo viene eseguito solo per tre volte per i = 0
a i < 3
. Il ciclo for viene eseguito in base alle condizioni. Codice Più interessante è bloccato in scanf()
come descritto di seguito:
vostra confusione è il motivo per cui è necessario inserire quattro numeri, non è perché si esegue un ciclo corre 4
volte, ma la sua causa scanf()
funzione restituisce solo quando si inserisce un carattere non-spazio (e dopo alcuni immettere premere per immettere un simbolo numerico che non è spazio.
Per capire questo comportamento leggere il manuale: int scanf(const char *format, ...);
:
Una sequenza di spazi vuoti (spazio, tabulazione, nuova riga, ecc .; cfr isspace(3)
). Questa direttiva corrisponde a qualsiasi quantità di spazio bianco, incluso nessuno, nell'input.
Perché nel primo ciclo di, in scanf()
aver incluso \n
in stringa di formato, in modo che solo scanf()
ritorni se comunicato un numero entrare (o un non-spazio chiave).
scanf("%d\n",(marks+i));
^
|
new line char
Cosa succede?
Supponiamo di ingresso al programma è:
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
'main' vuoto non è legale. Usa 'int main'. – chris
rimuovere '\ n' in scanf –