结构输出被最后一个用户输入覆盖

时间:2016-10-23 08:16:45

标签: c arrays loops struct dynamic-memory-allocation

我是C的初学者,我遇到了结构问题。 在我向用户询问所有属性之后,id就像打印结构的所有值。问题是,在我输入结构的所有属性并且它再次循环以再次询问属性之后,第一个struct输入被第二个struct输入替换。 我非常确定我会一遍又一遍地分配相同的内存空间,从而导致问题,但我仍然坚持如何修复它。我很欣赏任何关于我能做什么的建议。谢谢!

                    case 2:
                        printf ("Please input a SKU number:");
                            scanf ("%d", &item[MAX_ITEMS].sku_);
                        printf ("Quantity:");
                            scanf ("%d", &item[MAX_ITEMS].quantity_);
                        printf ("Price:");
                            scanf ("%f", &item[MAX_ITEMS].price_);
                        printf ("The item is successfully added to the inventory");
                    break;

打印出sku,数量和价格

                switch (menuSelection) {
                    case 1:
                        printf ("Inventory\n");
                        printf ("=========================================\n");
                        printf ("Sku         Price       Quantity\n");

                                for (i =0 ; i<=MAX_ITEMS; i++){
                                printf ("%d %.2f %d\n", item[i].sku_, item[i].price_, item[i].quantity_);
                                }

                        printf ("=========================================\n");
                    break;

这是我的全部代码:

#include <stdio.h>
#define MAX_ITEMS 10

struct Item{
    int sku_;
    float price_;
    int quantity_;
}item[MAX_ITEMS];


int main (void) {


int size=0;
int menuSelection;
int i=0;

    printf ("Welcome to the Shop\n");
    printf ("===================");

    do {
    printf ("\nPlease Select from the following options:\n");
    printf ("1) Display the inventory.\n");
    printf ("2) Add to shop.\n");
    printf ("0) Exit.\n");

    printf ("select:");
    scanf ("%d", &menuSelection);

            if (menuSelection <0 && menuSelection >2){
              printf ("Invalid input, try again: Please select from the following options:");
            }

            else {

                switch (menuSelection) {
                    case 1:
                        printf ("Inventory\n");
                        printf ("=========================================\n");
                        printf ("Sku         Price       Quantity\n");

                                for (i =0 ; i<=MAX_ITEMS; i++){
                                printf ("%d %.2f %d\n", item[i].sku_, item[i].price_, item[i].quantity_);
                                }

                        printf ("=========================================\n");
                    break;

                    case 2:
                        printf ("Please input a SKU number:");
                            scanf ("%d", &item[size].sku_);
                        printf ("Quantity:");
                            scanf ("%d", &item[size].quantity_);
                        printf ("Price:");
                            scanf ("%f", &item[size].price_);
                        printf ("The item is successfully added to the inventory");
                    break;

                    case 3:
                    break;
                }

            }

    } while (menuSelection != 0);


return 0;
}

3 个答案:

答案 0 :(得分:0)

您创建了一个Item个对象数组,其长度为MAX_ITEMS,目前为10。也就是说,您的对象的索引为09。然而,当要求用户输入时,您始终将数据存储在item[MAX_ITEMS],这超出了数组的范围。

作为旁注,在打印阵列时,您总是将其打印出来,这也意味着未初始化的项目。

您必须存储已经“添加到商店”的项目数量,并使用此数字来确定必须存储用户输入的下一个数组索引。打印时,您只需迭代已存储的项目。不要忘记边界检查,例如当您的商店满员时,不允许新用户输入。

答案 1 :(得分:0)

问题是您始终将新值保存在同一位置:

item[MAX_ITEMS].sku_

相反,您应该有一个计数器,显示存储的项目数量,并将新值保存在与计数器相同的位置:

item[counter].sku_

每次插入后都应增加计数器:

counter++;

因此,您的代码应如下所示:

int counter=0;
...
case 2:
    printf ("Please input a SKU number:");
    scanf ("%d", &item[counter].sku_);
    printf ("Quantity:");
    scanf ("%d", &item[counter].quantity_);
    printf ("Price:");
    scanf ("%f", &item[counter].price_);
    printf ("The item is successfully added to the inventory");
    counter++;
break;

我希望我有所帮助

答案 2 :(得分:0)

您定义的item是一个大小为MAX_ITEMS的数组,因此您的问题不是结构而是数组。

在大多数计算机编程语言中,索引数组应该使用零偏移量。也就是说,MAX_ITEMS的{​​{1}}超出了数组的范围,你遇到了一个错误并且找不到它。当您向商店添加商品时,您应该这样编码:

item[MAX_ITEMS]