Невозможно найти ошибку в этой программе на C - PullRequest
3 голосов
/ 31 июля 2010

Я не могу найти ошибку в этой программе на 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-м scanf.Почему так?и почему он прочитал мой второй раз вход в 3-й элемент массива?

Ответы [ 3 ]

8 голосов
/ 31 июля 2010

Добавьте 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
  } 

PS: Не используйте scanf() для char ввода.

7 голосов
/ 31 июля 2010

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

#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 голосов
/ 31 июля 2010

Вы можете добавить fflush(stdin); перед сканированием. .

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

int fflush(FILE *ostream);

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

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

...