我无法在此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的输入,但它不会等待我在3rd scanf中的输入。为什么这样?为什么它会将我的第二次输入读入第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
}
答案 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功能导致任何未写入 要传递的流的数据 到要写的主机环境 到文件; 否则,行为 未定义。