C 对于循环跳过第二次和以后的扫描

C 对于循环跳过第二次和以后的扫描,c,C,我注意到只有for循环中的第一个scanf被请求,其余的跳过了scanf请求 int main() { int c = 0; int i; struct book { char name[20]; float price; int page; }; printf("\n enter number of book to add\n "); scanf("%d", &c); s

我注意到只有for循环中的第一个scanf被请求,其余的跳过了scanf请求

int main()
{
    int c = 0;
    int i;

    struct book
    {
        char name[20];
        float price;
        int page;
    };

    printf("\n enter number of book to add\n ");
    scanf("%d", &c);
    struct book b[c];
    printf("\n book details  \n ");

    for (i = 1; i < c; i++)
    {
        printf("\n enter name for book %d", i);
        scanf(" %c", &b[i].name);
        fflush(stdin);
        printf("\n enter price for book %d", i);
        scanf(" %f", &b[i].price);
        fflush(stdin);
        printf("\n enter page for book %d", i);
        scanf(" %d", &b[i].page);
    }
}
intmain()
{
int c=0;
int i;
结构体的构造
{
字符名[20];
浮动价格;
整版;
};
printf(“\n输入要添加的图书编号”\n”);
scanf(“%d”、&c);
结构书b[c];
printf(“\n书籍详细信息\n”);
对于(i=1;i
输出

输入要添加的图书编号3

图书详细信息输入图书名称

输入图书1的价格

为book 1输入第页

输入书2的名称

输入第2册的价格

输入第2册的页面

这:

看起来大错特错,它只读取一个字符,这个字符作为名称没有意义,也与您的用法不匹配

你可能是说:

scanf("%19s", b[i].name);
但这也很糟糕,因为
%s
将停止在空白处,并且书名可以有多个单词。最好使用
fgets()
获取完整的行,然后解析它们


在依赖所有
scanf()
调用成功之前,请确保检查它们的返回值!I/O很脆弱,可能会失败。

请更正以下声明:-

scanf(" %c",&b[i].name);  to scanf("%19s",b[i].name);
因为这是字符串而不是字符变量。要读取字符串,您需要使用
%s
,而不是
%c
。我们使用
%c
仅读取单个字符。比如说

char sex;

scanf(" %c",&sex);

另外,对于我们不需要提供
&
的数组,数组本身的行为就像C/C++中的指针一样。

欢迎使用StackOverflow!您的问题目前似乎没有实际问题,如果您编辑它,您可能会收到更多帮助。请注意,在仅输入流中调用
fflush
(如
stdin
)在C规范中被明确标记为未定义的行为。有些库将其作为语言的扩展来实现,但它不可移植,也不是您真正应该做的事情..至于您的问题,请考虑您试图阅读的名称!经验法则:scanf令人困惑,学习语言时不应使用。如果你花时间学习scanf,你就不是在学习C;您正在学习scanf格式语言。
scanf(“%s”,b[i].name)
缺少宽度限制,很像现在过时的
get()
。如果使用了
scanf()@chux,太好了!谢谢你的建议。我修改了我的答案?@mch-True,把它清理干净了。
char sex;

scanf(" %c",&sex);