2013-07-24 16 views
6

numaralı girişten depolayın. Yeni başlayanlara C cinsindeyim. Lütfen sorunuzun topal olduğunu düşünmeyin. Yazdığım bu programda, 'for' loop'u ilk defa kullandığımda, bir dizide sadece 3 değer beklediğimi, ancak 4 değerini ve sonraki 'for' döngüsünde beklenen show 3 değerlerini sakladığını düşünüyorum. Benim sorum neden 1 'için' döngüde 3 yerine 4 değer alır? scanf yılındaVerileri

#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

olarak eğer açıklamada oluşturulabilir 'boşluk main' yasal değildir. Int main' kullanın. – chris

+4

scanf –

cevap

11

\n sorun

#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; 
} 

Sebep:

Gelecek sadece 3 değerleri bir dizi depolanır ancak 4 değerlerini depolar ve bekliyoruz ' 'beklenen gösterim olarak 3 değer için değerler. Benim sorum neden 1 'için' 'döngüde 3 yerine 4 değer alır?

İlk: Hayır, sadece depolar 3 numara ama dizide marks[] değil 4 sayılar. İkinci

: döngü anlamak için ilginç sadece i < 3 için i = 0 için üç kez çalışır. For döngüsü koşula göre çalışır. aşağıda açıklandığı gibi Daha ilginç kod scanf() takıldı:

Dört rakam, onun değil döngü çalıştığı için 4 kez ama girmek zorunda neden senin karışıklık onun olmayan bir uzay kömürü girdiğinizde scanf() işlevi yalnızca döndürdüğü için (ve bazı numaralarından sonra tuşuna basarsanız, boşluk olmayan bir karakter girersiniz). int scanf(const char *format, ...);:

beyaz boşluk karakterleri dizisi (Boşluk, sekme, yeni satır, vb .; isspace(3) bakınız) Bu davranışı anlamak için

kılavuzunu okuyun. Bu yönerge girdisinde hiçbiri dahil olmak üzere herhangi bir beyaz boşluk, ile eşleşir. Eğer biçim dizesinde \n dahil ettik scanf() yılında Çünkü döngü en birinci yılında

, böylece scanf() döner sadece basın bir sayı (veya olmayan bir boşluk anahtar) girerseniz.

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

Ne olur? Programa

varsayalım girdidir:

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 dosyasında '\ n' kaldır ancak scanf'de% d sonra \ n kullanıldığında, i değeri 0 olduğunda ilk değeri 2 alır, ancak i değeri 1 ve 2 olduğunda yalnızca 1 alır, neden bu olur? – ranaarjun

+1

lütfen bu http://answers.yahoo.com/question/index?qid=20110801122000AA07FO8 adresinden devam edin. Bu, –

+1

@ GrijeshChauhan tam olarak nedenini tam olarak sağladığını umuyoruz :) Lütfen –

0

\n kaldırıp ifor (int i = 0; i < 3; i++) {}