第一个问题,为什么当我运行此程序时,它无法获得有关“scanf(”%d“,& books [ctr] - > pages)的用户数据;” ?而不是获取用户数据,它重新启动循环。
第二个问题,有人可以解释为什么getchar();在第一个循环结束时使用。如书中所述,它说“清除新行输入”,但这对我来说并没有多大意义。这与我遇到的问题有什么关系。
#include <stdio.h>
#include <stdlib.h>
struct bookInfo {
char title[40];
char auth[25];
float price;
int pages;
};
int main()
{
int ctr;
struct bookInfo * books[3];
//get info on books
for (ctr = 0; ctr < 3; ctr++)
{
books[ctr] = (struct bookInfo*)malloc(sizeof(struct bookInfo));
printf("What is the name of the book #%d?\n", (ctr+1));
fgets(books[ctr]->title, 40, stdin);
puts("Who is the author? ");
fgets(books[ctr]->auth, 25, stdin);
puts("How much did the book cost? ");
scanf(" $%f", &books[ctr]->price);
puts("How many pages are in the book? ");
scanf(" %d", &books[ctr]->pages);
getchar();
}
//print new header and then loop through and print info
printf("\n\nHere is the collection of books: \n");
for (ctr = 0; ctr < 3; ctr++)
{
printf("#%d: %s by %s", (ctr + 1), books[ctr]->title, books[ctr]->auth);
printf("\nIt is %d pages and costs $%.2f", books[ctr]->pages, books[ctr]->price);
printf("\n\n");
}
return(0);
}
我希望这个程序能够在完成循环之前收集书中有多少页,并询问有关书#2的信息。然而....
当我运行程序时,这就是我得到的......
这本书的名称是什么?
好书
谁是作者?好作者
这本书花了多少钱?
50
书中有多少页?
第2册书的名称是什么?
坏书谁是作者?
答案 0 :(得分:4)
问题在于,您从未检查过scanf()
!!
因此,按照您显示的输入,对于扫描语句(即format
字符串),如
scanf(" $%f", &books[ctr]->price);
50
的输入将导致匹配失败。因此,scanf()
将返回失败,然后输入将保留在输入缓冲区中,以便在下一次成功调用scanf()
时使用。在您的情况下,下一个转换规范似乎与输入完全匹配,因此您可以获得scanf()
从不等待用户输入的行为。
相关,引用C11
,章节§7.21.6.2/ P6,
通过读取下一个指令来执行普通多字节字符的指令 流的字符。如果这些字符中的任何一个与组成该字符的字符不同 指令,指令失败,不同和后续字符仍然未读。 [....]