我有这个代码,我使用一个结构,我制作了该结构的3个变量,并将用户输入的值存储到我的结构变量中。 但是,当我将数据输入到我的代码中时输出不正确。 这是我的代码:
#include<stdio.h>
struct book
{
char name;
float price;
int page;
}b1,b2,b3;
int main()
{
printf("entr the data\n");
scanf("%c %f %d",&b1.name,&b1.price,&b1.page);
scanf("%c %f %d",&b2.name,&b2.price,&b2.page);
scanf("%c %f %d",&b3.name,&b3.price,&b3.page);
printf("%c %f %d\n",b1.name,b1.price,b1.page);
printf("%c %f %d\n",b2.name,b2.price,b2.page);
printf("%c %f %d\n",b3.name,b3.price,b3.page);
return 0;
}
输入:
a 5 5
b 6 6
c 7 7
假设输出:
a 5.000000 5
b 6.000000 6
c 7.000000 7
但输出的结果是:
a 5.000000 5
0.000000 0
b 6.000000 6
我不知道为什么会这样。这是我试图运行我的程序的ideone链接,只是为了检查我的编译器是否有问题。 这是链接:http://ideone.com/I0RvJ8
请帮助大家..提前致谢:)
答案 0 :(得分:2)
ENTER键给出换行符,该字符也计为%c的字符。
答案 1 :(得分:1)
试试这个男人!一个小空间b / w%c,它开始工作哇!
#include<stdio.h>
struct book
{
char name;
float price;
int page;
}b1,b2,b3;
int main()
{
printf("enter the data\n");
scanf("%c %f %d",&b1.name,&b1.price,&b1.page);
scanf(" %c %f %d",&b2.name,&b2.price,&b2.page);
scanf(" %c %f %d",&b3.name,&b3.price,&b3.page);
printf("%c %f %d\n",b1.name,b1.price,b1.page);
printf("%c %f %d\n",b2.name,b2.price,b2.page);
printf("%c %f %d\n",b3.name,b3.price,b3.page);
return 0;
}
答案 2 :(得分:0)
您按下回车键,您需要处理它产生的换行符(或者您将输入存储在一个文件中,其中换行符位于每行的末尾)。您可以在每个getchar()
之后添加scanf
来电,以占用\n
个字符。否则,每个\n
将被解释为char并由scanf读取。
scanf("%c %f %d",&b1.name,&b1.price,&b1.page);
getchar();
scanf("%c %f %d",&b2.name,&b2.price,&b2.page);
getchar();
scanf("%c %f %d",&b3.name,&b3.price,&b3.page);
getchar();
请注意,getchar
修补程序仅适用于您指定的输入,即每行处理一个\n
。如果在三组输入中的每一组之间会有更多换行符,则另一个修复方法是使一个大scanf
:
scanf("%c%f%d %c%f%d %c%f%d",&b1.name,&b1.price,&b1.page
,&b2.name,&b2.price,&b2.page
,&b3.name,&b3.price,&b3.page);
这与@AndreyT建议相同,但放在一个scanf
电话中。
有关scanf
%c
说明符的人工页面说明了什么:
(...)通常跳过前导空格被抑制。跳过白色 首先是空格,使用格式的显式空格。
上面的scanf格式在下一行读取%c
之前会占用所有空白字符,第一个非空白字符将被解释为char。
最后一个修复是提到的:
scanf(" %c%f%d",&b1.name,&b1.price,&b1.page);
scanf(" %c%f%d",&b2.name,&b2.price,&b2.page);
scanf(" %c%f%d",&b3.name,&b3.price,&b3.page);
请注意,scanf格式的" "
匹配来自stdin的0或更多空白字符。因此,格式" %c%f%d"
也适用于第一次扫描。