无法在此C程序中找到错误

时间:2010-07-31 14:38:11

标签: c input scanf

我无法在此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 1b 2 2c 3 3作为每个scanfs的输入,但它不会等待我在3rd scanf中的输入。为什么这样?为什么它会将我的第二次输入读入第3个数组元素?

3 个答案:

答案 0 :(得分:8)

scanf()

之后添加getchar()
 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.

答案 1 :(得分:7)

与其他说明符不同,%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;
}

答案 2 :(得分:0)

您可以在scanf之前添加fflush(stdin);

事实证明,您不应在fflush上使用stdin,因为fflush 仅定义来处理输出流。换句话说,fflush在输入流上有未定义的行为。

int fflush(FILE *ostream);

C标准的摘录说:

  

ostream 指向输出流或   最新的更新流   最近的操作没有输入,   fflush功能导致任何未写入   要传递的流的数据   到要写的主机环境   到文件; 否则,行为   未定义。