2010-07-31 2 views
3

Я не могу найти ошибку в этой программе на C.Невозможно найти ошибку в этой программе на C

#include <stdio.h> 

int main() 
{ 

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

    struct book b[3] ; 
    int i ; int k; 
    for (i = 0 ; i <= 2 ; i++) 
    { 
     printf ("\nEnter name, price and pages: ") ; 
     k = scanf ("%c %f %d", &b[i].name, &b[i].price, &b[i].pages) ; 
    } 
    for (i = 0 ; i <= 2 ; i++) 
     printf ("\n%c %f %d", b[i].name, b[i].price, b[i].pages) ; 
    //getch(); 
    return 0; 
} 

Время работы:

Enter name, price and pages: a 1 1 

Enter name, price and pages: b 2 2 

Enter name, price and pages: 
a 1.000000 1 

7922540190797673100000000000000000.000000 4200368 
b 2.000000 2 

Я хотел дать a 1 1, b 2 2, c 3 3 как мои входы для каждого scanfs, но не ждать моего входа в 3 зсапЕ. Почему так? и почему он прочитал мой второй вход во второй элемент массива elementof?

+4

И теперь вы обнаруживаете, почему NOBODY использует scanf. –

+0

@Paul Tomblin: Потрясенный! NOBODY использует scanf ?? Зачем?? Что именно здесь происходит. Что мне здесь не хватает? – 2010-07-31 14:47:05

+4

@walter Никто не использует scanf для обработки данных от людей. – 2010-07-31 14:57:16

ответ

8

Добавить getchar() после scanf()

for (i = 0 ; i <= 2 ; i++) 
    { 
     printf ("\nEnter name, price and pages: ") ; 
     k = scanf ("%c %f %d", &b[i].name, &b[i].price, &b[i].pages) ; 

     getchar(); //will clear the buffer 
    } 

P.S: Don't use scanf() for char entry.

+0

Отлично, это сработало! – 2010-07-31 14:51:59

+5

+1 для ссылки «Не используйте scanf() для записи char». – claws

+0

@Downvoter: Пожалуйста, объясните свое нижнее положение. –

7

В отличие от других спецификаторов,% C при использовании зсапЕ не игнорирует пробелы. Вы, вероятно, хотите, чтобы строки поля имени в любом случае:

#include <stdio.h> 

int main() 
{ 
    struct book 
    { 
     char name[10] ; // or some suitable size 
     float price ; 
     int pages ; 
    } ; 

    struct book b[3] ; 
    int i ; int k; 
    for (i = 0 ; i <= 2 ; i++) 
    { 
     printf ("\nEnter name, price and pages: ") ; 
     k = scanf ("%s %f %d", b[i].name, &b[i].price, &b[i].pages) ; 
    } 
    for (i = 0 ; i <= 2 ; i++) 
     printf ("\n%s %f %d", b[i].name, b[i].price, b[i].pages) ; 
    return 0; 
} 
0

Вы можете добавить fflush(stdin); до вашего зсапЕ. .

Оказывается, что вы не должны использовать fflush на stdin, потому что fflush является только определяется для работы на выходных потоков. Другими словами, fflush имеет неопределенное поведение на входных потоках.

int fflush(FILE *ostream); 

выдержка из стандарта C говорит:

ostream точки в выходной поток или поток обновлений, в котором в последнее время операции наиболее не введен, fflush функциональные причины любые неписаные данные для этого потока, который должен быть доставлен , в среду-хозяин, которая будет называться ; в противном случае поведение не определено.

+0

Нет, вы не можете - fflush определяется только для работы с выходными потоками. – 2010-07-31 14:55:43

+1

'fflush (stdin)' вызывает Undefined Behavior. –

+0

Неправильно, хотя он может работать: http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1052863818&id=1043284351 – siride