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)
如你看到的:
structure variable(b2),printf()停止工作并且不接受信息.关于第三个structure variable(b3)scanf(),我在第二行得到一些垃圾值 -0.00 3我想也许结构定义应该main()总是在外面,所以我甚至修改它来定义struct book外部main()并struct book b1,b2,b3;在main()中声明变量,但它没有任何效果.
我在这做错了什么?
更新 -
我知道存在于SO类似的答案在这里,但这里的问题是,addressof(&)运营商并没有包含在scanf()
输入第一行值后,按ENTER键,新行字符仍在输入缓冲区中,并"%c"在下一个处理中处理scanf.
要解决此问题,请不要使用scanf.相反,使用fgets获取每一行然后用来sscanf从每一行获取值.
大多数书名都比单个字符长,但%c格式将书名限制为一个字符。您的结构也只存储一个字符,因此您需要更改定义以允许更长的标题。更成问题的是,大多数书名都比一个单词长,但作为%s'明显' 替代方案的格式%c只能读取到第一个空格,这意味着它只读取第一个单词。
您还应该在scanf()每次使用它时检查返回值。如果不是 3,则出现问题。你有问题的原因是输入的第一行以换行符结尾,不是%d格式读取的,所以是读取的%c,然后数字转换在字母上失败。您可以通过" %c %.2f %d"在%c跳过可选的前导空格之前使用空格来解决这个问题(这将跳过换行符;它算作空格)。
对此没有简单的解决方法。您需要知道如何将标题的结尾与价格和页数区分开来。我可能会fgets()用来读取整行输入。然后我会向后扫描以找到页数和价格;该行的剩余部分可能是书名。
| 归档时间: |
|
| 查看次数: |
1149 次 |
| 最近记录: |