2013-02-19 48 views
-2

我正在用C语言开发一个关于图书馆管理系统的迷你项目。但我在使用结构时遇到问题,我花了很多时间去理解,但我无法理解。不可预测的输出


下面是一个代码:

struct book 
{ 
char name;  
float price;  
int pages; 
}b1,b2,b3; 
int main() 
{ 
clrscr(); 
printf("Enter names,price & no.of pages of 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(" %c %f %d",b1.name,b1.price,b1.pages); 
printf(" %c %f %d",b2.name,b2.price,b2.pages); 
printf(" %c %f %d",b3.name,b3.price,b3.pages); 
getch(); 
return 0; 
}  

输出:

Enter names,price & no.of pages of 3 books 
a 3.3 2 
b 2.2 3 
a 0.000000 2 
0.000000 0 b 0.000000 3 

有两个混淆:

  1. 为什么scanf("%c%f%d",&b3.name,&b3.price,&b3.pages);未执行?
  2. 难以预测的输出?
+1

请采取适当缩进代码的时间。如果你不能费尽心思编写你的问题,为什么我们应该烦恼去阅读它? – meagar 2013-02-19 18:21:32

+2

你是什么意思“无法正常访问”? – 2013-02-19 18:21:41

回答

1

我希望你想要的格式代码char*或一个固定大小的数组char的名称和%s,而不仅仅是一个单一char%c,但我可能是错的。

+0

他的下一个问题将是“为什么我的程序崩溃”!? – StoryTeller 2013-02-19 18:28:24

+0

是的确... :) – 2013-02-19 18:28:54

2

我相信随后的scanf换行符会被放入下一个%c。 (所以书1将投入正常工作预定2将有它的名字是“\n”,并没有浮动或int对于该线路上的页面长度,所以它们是0书2)

尝试添加\n在你scanf线,像这样结束:

scanf("%c %f %d\n",&b1.name,&b1.price,&b1.pages); 

完整的示例在这里:http://ideone.com/Gxs6Y8

如果你想比单个字符,所以你会做这样的事情不再书名:

#define MAX_NAME_LENGTH 256 
struct book 
{ 
    char name[MAX_NAME_LENGTH]; 
    float price; 
    int pages; 
} b1, b2, b3; 

你会再使用%s代替%c和喜欢:

//note you no longer need & of b1.name as it already is a pointer to what you want 
scanf("%s%f%d",b1.name,&b1.price,&b1.pages); 

这里举例:http://ideone.com/EPYrJW

+0

是的,你写...但我只是检查..为什么%c不在这里工作 – 2013-02-19 18:42:19

+0

@ArshadJuned%c查找单个字符,而%s是整个字符串。你可以在格式说明符[这里]找到一个体面的教程(http://www.codingunit.com/printf-format-specifiers-format-conversions-and-formatted-output)。 – 2013-02-19 18:52:12

+0

是的,我知道但如果我想只输入1个字符,那么? ...这只是一个代码,我只是想在这里为什么%c没有正确访问 – 2013-02-19 18:58:04