C 为什么我能';输入第二本书的书名?

C 为什么我能';输入第二本书的书名?,c,structure,C,Structure,当我编译这个程序时,我不能输入book2.title名称, 使用Get Function有错吗?为什么? 请再解释一下 #include<stdio.h> #include<string.h> struct name{ char author[20]; char title[20]; float price; }; int main() { struct name book1,book2; printf("Enter 1st title name:");

当我编译这个程序时,我不能输入book2.title名称, 使用Get Function有错吗?为什么? 请再解释一下

#include<stdio.h>
#include<string.h>
struct name{
char author[20];
char title[20];
float price;
};
int main()
{
    struct name book1,book2;
    printf("Enter 1st title name:");
    gets(book1.title);
    printf("Enter 1st Author name:");
    gets(book1.author);
    printf("Enter 1st Book price:");
    scanf("%f",&book1.price);
    printf("\nThe 1st Book Name is %s",book1.title);
    printf("\nThe 1st Book Author is %s",book1.author);
    printf("\nThe 1st Book Price is %f",book1.price);
    printf("\nEnter 2nd title name:");
    gets(book2.title);
    printf("Enter 2nd Author name:");
    gets(book2.author);
    printf("Enter 2nd Book price:");
    scanf("%f",&book2.price);

    printf("\nThe 2nd Book Name is %s",book2.title);
    printf("\nThe 2nd Book Author is %s",book2.author);
    printf("\nThe 2nd Book Price is %f",book2.title);
     return 0;


}


#包括
#包括
结构名{
char作者[20];
字符标题[20];
浮动价格;
};
int main()
{
结构名称book1、book2;
printf(“输入第一个标题名称:”);
获取(book1.title);
printf(“输入第一作者姓名:”);
获取(book1.author);
printf(“输入第一本书的价格:”);
scanf(“%f”和book1.价格);
printf(“\n第一本书名为%s”,书名为1.title);
printf(“\n第一本书的作者是%s”,第1本书的作者);
printf(“\n第一本书的价格是%f”,第1本书的价格);
printf(“\n输入第二个标题名:”);
获取(book2.title);
printf(“输入第二作者姓名:”);
获取(book2.author);
printf(“输入第二册价格:”);
scanf(“%f”和book2.价格);
printf(“\n第二本书名为%s”,书名为2.title);
printf(“\n第二本书作者是%s”,第2本书作者);
printf(“\n第二本书的价格是%f”,第2本书的标题);
返回0;
}

您的代码有两个与您的问题无关的问题:

  • gets的使用
  • printf
    中对字符串使用
    %f
但是,导致您提出问题的行为在于以下两行:

scanf("%f",&book1.price);
...
gets(book2.title);
注意,当您在终端中输入book1价格(例如12.3)时,随后按enter键。因此,
stdin
缓冲区保存字符
12.3\n
。scanf读取前几个字节,它可以将其解释为浮点
12.3
,使缓冲区保留
\n
。现在,当运行<代码>获取< /代码>时,它会读取换行符,而您的第二本书的标题是空白字符串“\ 0”。

请参阅本网站:


注意:请使用fgets/scanf/getline而不是get。有关更多信息,请参阅@RobertS在上述评论中发布的链接。

您的代码有两个与您的问题无关的问题:

  • gets的使用
  • printf
    中对字符串使用
    %f
但是,导致您提出问题的行为在于以下两行:

scanf("%f",&book1.price);
...
gets(book2.title);
注意,当您在终端中输入book1价格(例如12.3)时,随后按enter键。因此,
stdin
缓冲区保存字符
12.3\n
。scanf读取前几个字节,它可以将其解释为浮点
12.3
,使缓冲区保留
\n
。现在,当运行<代码>获取< /代码>时,它会读取换行符,而您的第二本书的标题是空白字符串“\ 0”。

请参阅本网站:


注意:请使用fgets/scanf/getline而不是get。有关更多信息,请参阅@RobertS在上述评论中发布的链接。

您是否查看了编译器警告?例如,此行
printf(“\n第二本书的价格是%f”,book2.title)
想要打印一个浮点数,但得到了一个字符串。请考虑可能希望帮助您解决此问题的人是如何遇到此问题的。另外,关于您使用
获取
而不是
scanf
:请提供更多信息。您当前的问题几乎不包含找到解决方案的有用信息。您是否查看了编译器警告?例如,此行
printf(“\n第二本书的价格是%f”,book2.title)
想要打印一个浮点数,但得到了一个字符串。请考虑可能希望帮助您解决此问题的人是如何遇到此问题的。另外,关于您使用
获取
而不是
scanf
:请提供更多信息。你当前的问题几乎没有有用的信息来找到解决方案。虽然这是糖衣,你不需要参考我的评论。只要链接就可以了。:-)我同意我应该把它说得更有建设性。编辑。我之所以写这一部分,是因为作者显然没有在编译过程中阅读警告。你可以特别提示被忽略的警告。(无需显示确切的警告,但说明OP明显禁用或忽略了这些警告)。顺便说一句,OP没有指定他们的编译器,甚至可能不是一个符合标准的编译器,它根本不会显示任何警告。附言:你知道如何链接到评论吗?虽然这是糖衣,但你不需要参考我的评论。只要链接就可以了。:-)我同意我应该把它说得更有建设性。编辑。我之所以写这一部分,是因为作者显然没有在编译过程中阅读警告。你可以特别提示被忽略的警告。(无需显示确切的警告,但说明OP明显禁用或忽略了这些警告)。顺便说一句,OP没有指定他们的编译器,甚至可能不是一个符合标准的编译器,它根本不会显示任何警告。附言:你知道如何链接到注释吗?