2016-03-20 21 views
-2

alarak üç scanf Burada Temel Yapı kodu var, Ama çıktı beklendiği gibi değil. Üç scanf fonksiyonu var ama sadece ikisi çalıştırılıyor. Ortadaki çöp değeri.iki tarama ve çöp değeri

#include <stdio.h> 

int main() 
{ 
    struct book 
    { 
     char name; 
     float price; 
     int pages; 
    }; 

    struct book b1,b2,b3; 

    printf("Enter names , prices & no of pages of 3 books\n"); 
    scanf("%c%f%d",&b1.name,&b1.price,&b1.pages); 
    scanf("%c%f%d",&b2.name,&b2.price,&b2.pages); 
    scanf("%c%f%d",&b3.name,&b3.price,&b3.pages); 

    printf("And this is what you entered\n"); 
    printf("%c%f%d",b1.name,b1.price,b1.pages); 
    printf("%c%f%d",b2.name,b2.price,b2.pages); 
    printf("%c%f%d",b3.name,b3.price,b3.pages); 

    return 0; 
} 
+0

https://ideone.com/SKNfAS onun sadece bir karakter –

+5

'scanf ("% c% f% D" scanf ("% c% f% d" - – BLUEPIXY

+1

) bazı arabellek kurallarına bağlı olarak rakam veya boşluktan önce beyaz boşluk sağlar; yani scanf ("% c% d% f", bla, blaa, blaaa); ' – NERDYLIZARD

cevap

2

Basitçe değiştirmek

scanf("%c%f%d", &bx.name, &bx.price, &bx.pages); 

daha sonra "% c tarafından tüketilen edilecektir, bir '\ n' stdin kalan, Enter tuşuna bastıktan sonra

scanf(" %c%f%d", &b1.name, &b1.price, &b1.pages); 

için ". Bir karakter ('\ n') okunduğunda, scanf(), kayan nokta sayısını, biçim dizisinde "% f" olarak belirtildiğini belirtir. Bununla birlikte, istenen kayan nokta sayısını elde etmek yerine, bir karakterle karşılaşır ve ne yazık ki geri döner. Sonuç olarak, &bx.price ve &bx.pages güncelleştirilmez, böylece başlatılmamış olarak kalır ve size çöp değerleri verir.

scanf() içinde bir boşluk ile, tüm boşluk karakterleri (varsa) okuma başlamadan önce atılır. \n kaldırıldığı için, okuma süreci (muhtemelen) başarılı olacaktır.

Ayrıca, sadece bir ipucu: Her zamanscanf() dönüş değerini kontrol edin, çünkü kullanıcıların gireceği şeyleri asla bilmeyeceksiniz.

örnek kod:

#include <stdio.h> 

struct book 
{ 
    char name; 
    float price; 
    int pages; 
}; 

int main() 
{ 
    struct book b1, b2, ..., bx; 

    printf("Enter names, prices & no of pages of x books:\n"); 
    while (scanf(" %c%f%d", &bx.name, &bx.price, &bx.pages) != 3) 
    { 
     fputs("Error reading bx. Please try again:\n", stderr); 
     scanf("%*[^\n] "); 
    } 
    ...... 

    printf("And this is what you have entered:\n"); 
    printf("%c %f %d", bx.name, bx.price, bx.pages); 
    ...... 

    return 0; 
} 

Örnek giriş & çıkışı:

Enter names, prices & no of pages of x books: 
asd wedewc efcew 
Error reading bx. Please try again: 
a 12.34 42 
And this is what you have entered: 
a 12.340000 42 
0

scanf, genellikle, standart satırlardan gelen karakterleri ve boşlukları da içeren standart giriş akışından okur. scanf ("% c") kullanmadan önce stdin akışında kalan tüm istenmeyen girişleri temizlemeyi deneyin;

Ayrıca unutmayın: biçim dizesi

bu yardımcı olabilecek Umut ortasında bir yerlerde% c düşüş izin vermeyin. ne yazık ki

printf("Enter names , prices & no of pages of 3 books\n"); 
fflush(stdin); 
scanf("%c%f%d",&b1.name,&b1.price,&b1.pages); 

Ayrıca boşlukları okumak için scanf% c önce boşluk kullanabilir "Sizin" programında tüm scanf önce kullanmalıdır.

scanf(" %c"....); 
+0

'fflush (stdin);' undefined davranış? –

+0

@sun qingyao Evet 'fflush (stdin)' UB olduğunu. "Aktarım bir çıkış akışına veya bir güncelleme akışına işaret ediyorsa ... fflush işlevi bu akış için herhangi bir yazılmamış veriyi iletir ... aksi halde davranış tanımsızdır.". Stdin bir çıkış akışı veya bir akışı güncelle. _some_ sistemlerinde, 'fflush (stdin)' akışını boşaltır ve aynı kodun diğer makinelerde farklı sonuçları vardır. Sağlam kod 'fflush (stdin)' kullanmaz. – chux