为什么此程序中的scanf()无法获得输入?

时间:2017-12-04 20:35:08

标签: c scanf

第一个问题,为什么当我运行此程序时,它无法获得有关“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册书的名称是什么?

     坏书

     

谁是作者?

1 个答案:

答案 0 :(得分:4)

问题在于,您从未检查过scanf() !!

的重播值

因此,按照您显示的输入,对于扫描语句(即format字符串),如

 scanf(" $%f", &books[ctr]->price);

50的输入将导致匹配失败。因此,scanf()将返回失败,然后输入将保留在输入缓冲区中,以便在下一次成功调用scanf()时使用。在您的情况下,下一个转换规范似乎与输入完全匹配,因此您可以获得scanf()从不等待用户输入的行为。

相关,引用C11,章节§7.21.6.2/ P6,

  

通过读取下一个指令来执行普通多字节字符的指令   流的字符。如果这些字符中的任何一个与组成该字符的字符不同   指令,指令失败,不同和后续字符仍然未读。 [....]