为什么scanf不接受这个C结构的元素?

Man*_*iri 0 c struct structure scanf

我是C的新手,正在研究结构.我创建了一个简单的结构,并尝试通过scanf()结构变量输入输入值,但我只获得部分/垃圾输出.我在这里错过了什么吗?

这是我的原始代码 -

#include<stdio.h>
void main()
{
    struct book
    {
        char name;
        float price;
        int pages;
    };

    struct book b1,b2,b3;
    int i;
    printf("\n Enter the names, prices and no. of pages of the 3 books: \n");
    scanf("%c %f %d", &b1.name,&b1.price, &b1.pages);
    scanf("%c %f %d", &b2.name,&b2.price, &b2.pages);
    scanf("%c %f %d", &b3.name,&b3.price, &b3.pages);   

    printf("\n You have entered: \n");
    printf("%c %.2f %d", b1.name,b1.price, b1.pages);
    printf("%c %.2f %d", b2.name,b2.price, b2.pages);
    printf("%c %.2f %d", b3.name,b3.price, b3.pages);
}
Run Code Online (Sandbox Code Playgroud)

这是一组输出 -

Enter names, prices & no. of pages of 3 books
A 230.5 13
B 345.9 33

And this is what you entered
A 230.50 13

 0.00 3
B 345.89 33
Run Code Online (Sandbox Code Playgroud)

如你看到的:

  1. 一旦我输入关于第二个的信息structure variable(b2),printf()停止工作并且不接受信息.关于第三个structure variable(b3)
  2. 当它突然停止接受值时scanf(),我在第二行得到一些垃圾值 -0.00 3

我想也许结构定义应该main()总是在外面,所以我甚至修改它来定义struct book外部main()struct book b1,b2,b3;在main()中声明变量,但它没有任何效果.

我在这做错了什么?

更新 -

我知道存在于SO类似的答案在这里,但这里的问题是,addressof(&)运营商并没有包含在scanf()

Yu *_*Hao 5

输入第一行值后,按ENTER键,新行字符仍在输入缓冲区中,并"%c"在下一个处理中处理scanf.

要解决此问题,请不要使用scanf.相反,使用fgets获取每一行然后用来sscanf从每一行获取值.


Jon*_*ler 5

大多数书名都比单个字符长,但%c格式将书名限制为一个字符。您的结构也只存储一个字符,因此您需要更改定义以允许更长的标题。更成问题的是,大多数书名都比一个单词长,但作为%s'明显' 替代方案的格式%c只能读取到第一个空格,这意味着它只读取第一个单词。

您还应该在scanf()每次使用它时检查返回值。如果不是 3,则出现问题。你有问题的原因是输入的第一行以换行符结尾,不是%d格式读取的,所以是读取的%c,然后数字转换在字母上失败。您可以通过" %c %.2f %d"%c跳过可选的前导空格之前使用空格来解决这个问题(这将跳过换行符;它算作空格)。

对此没有简单的解决方法。您需要知道如何将标题的结尾与价格和页数区分开来。我可能会fgets()用来读取整行输入。然后我会向后扫描以找到页数和价格;该行的剩余部分可能是书名。