我试图将一些products
存储在一个数组中,并且进一步,我将向该数组中插入新产品,或者从该数组中删除一个现有产品。这是我的计划,我正在尝试类似波纹管的东西。循环时,第一个循环成功执行,但是从第二个循环开始仅显示Enter product name
,但是scanf("%s", p[i].pname)
没有让我插入值。有人可以帮我解决这个问题!
#include <stdio.h>
struct product{
char pname[30];
int quantity;
float cost;
};
/*void insertnew();
void delete();*/
void main()
{
struct product p[50];
int i;
for(i = 0; i < 3; i++){
printf("Enter Product Name:\n");
scanf("%s", p[i].pname);
printf("Enter Quantity:\n");
scanf("%d", &p[i].quantity);
printf("Enter Cost:\n");
scanf("%.2f", &p[i].cost);
printf("*****************\n");
}
for(i = 0; i < 3; i++){
printf("Name = %s\n",p[i].pname);
printf("Quantity = %d\n",p[i].quantity);
printf("Cost = %.2f\n",p[i].cost);
printf("-----------\n");
}
}
/*void insertnew(){}
void insertnew(){}*/
如果我要做什么,insertnew()
和delete()
是正确的方法,对我会更有帮助?
输出:
答案 0 :(得分:4)
当您尝试读float
时,问题就出在这里:
scanf("%.2f", &p[i].cost);
scanf
的格式说明符与printf
的格式说明符不同,它不使用精度说明符。这意味着.
字符作为格式字符串的一部分无效。
如果在启用警告的情况下进行编译(在gcc上为-Wall -Wextra
),则会警告您:
x1.c:20:8: warning: unknown conversion type character ‘.’ in format [-Wformat=]
scanf("%.2f", &p[i].cost);
^
这将导致在您为该字段输入值时什么都不会读入,并且给定的文本保留在输入缓冲区中。当下一个scanf
执行时期望一个字符串时,它将在不提示的情况下读取缓冲区中已经存在的内容。
处理此问题的正确方法(至少对于float
而言)是删除任何一种长度说明符:
scanf("%f", &p[i].cost);
如果用户输入更多有效数字,则使用%.2f
打印时将看不到它们。
答案 1 :(得分:3)
当我尝试使用gcc编译您的代码时,我得到了警告:
prod.c:20:8: warning: unknown conversion type character ‘.’
in format [-Wformat=]
scanf("%.2f", &p[i].cost);
这引起了我对虚假“”的注意。在scanf参数中。删除它后,它会毫无警告地进行编译,并且您的代码为我扫描了所有三个项目并正确打印了它们。
但是请注意,尽管上面的操作很简单,但是您需要执行输入验证测试scanf()
的返回值,并在失败的情况下重试或中止输入-根据您的意图如果输入无效,该怎么办。或者-更加健壮-正如Weather Vane的评论中所建议的那样,使用fgets()
将输入读取为字符串,然后尝试使用sscanf()
进行解析。
总体而言,如果输入内容可能包含无效的条目,scanf()
不太适合-您应该构建一些自定义解决方案。
答案 2 :(得分:0)
cost期望存储一个float类型。因此,扫描浮点数。 (那么它可以以任何格式显示)
scanf("%f", &p[i].cost);
然后它起作用:
Enter Product Name:
boxa
Enter Quantity:
10
Enter Cost:
11.5
*****************
Enter Product Name:
boxb
Enter Quantity:
4
Enter Cost:
12.4
*****************
Enter Product Name:
boxc
Enter Quantity:
122
Enter Cost:
3.3
*****************
Name = boxa
Quantity = 10
Cost = 11.50
-----------
Name = boxb
Quantity = 4
Cost = 12.40
-----------
Name = boxc
Quantity = 122
Cost = 3.30
-----------
答案 3 :(得分:0)
你不能做
scanf("%.2f",&p[i].cost);
Scanf不接受格式化的float值。您只能在打印值时更改它。将该行更改为
scanf("%f",&p[i].cost)
其他一切似乎都很好。