对于在C中执行第一次循环后忽略第一行的循环

时间:2019-07-15 18:52:51

标签: c arrays search struct insert

我试图将一些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()是正确的方法,对我会更有帮助?

输出:

enter image description here

4 个答案:

答案 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)

其他一切似乎都很好。