首页 > 解决方案 > 我试图遍历一个结构数组,并在我再次调用该函数(for循环)时从我离开的地方继续

问题描述

所以,我是 C 的初学者,我正在编写一个简单的 I/O 程序,我遇到了一个问题。

我想将一些数据存储在一个结构数组中,然后我想再次调用该函数,并在之前存储的数据之后存储数据。但问题是当我再次调用该函数并存储数据时,它会覆盖存储的旧数据。

例子:

如果用户想先输入例如 3 个条目,下次再输入 2 个条目,则前 3 个应存储在stock_[0]...stock_[2]中,接下来的 2个应存储在stock_[3]等中stock_[4]

这是我的代码。我试过用static int i;作为迭代计数器,但这也无济于事。

这是结构:

struct stock{
    char item_name[100];
    float item_rate;
    int item_quantity;
} stock_[99];

这是代码:

choice_1:
    printf("\n\n\t\t===================================");
    printf("\n\t\tHow many Entries you want to make to the stock: ");
    scanf("%d", &entry);
    system("cls");
    for(i=index_stock;i<entry;i++)
    {
        printf("\n\t\tEnter Item - %d Name: ",i+1);
        scanf("%s",stock_[i].item_name);
        printf("\t\tEnter its Rate(price per 1 item): ");
        scanf("%f", &stock_[i].item_rate);
        printf("\t\tEnter its Quantity: ");
        scanf("%d", &stock_[i].item_quantity);
        printf("\t\tStock Updated Successfully!");
        printf("\n\n\t\t===================================");
    }
choice_3:
    printf("\n\n\t\tPress 1 to Add another item to Stock\n\t\tPress 2 to go to Stock Menu\n\t\tPress 3 to go to Main Menu\n\t\tPress 4 to Exit Program\n\t\t->Please make a choice: ");
    int choice_s_;
    scanf("%d", &choice_s_);
    if(choice_s_==1)
    {
        system("cls");
        goto choice_1;
    }

所以在这里如果我输入一些数据,然后想输入更多数据(即在完成后再次调用for循环,即

if(choice_s_==1)
{
    system("cls");
    goto choice_1; //calling the loop again to input data
}

它会覆盖旧数据。我尽力解释我的问题,我的英语很弱,很抱歉

编辑 1: 我在全局定义了一个变量int index_stock=0;并在 for 循环结束时更新了它的值index_stock=i;,现在的问题是最后一个数据被新输入的数据覆盖,而不是像以前一样被整个数据覆盖。示例:我第一次存储了 ''Shoes'' 和 ''Loffers'',然后当我再次调用它来存储更​​多数据时,比如说 ''Joggers'',然后会发生 ''Loffers'' 被覆盖由''慢跑者''。我的意思是,如果我打印所有存储的数据,它会打印 ''Shoes'' 和 ''Joggers'' 而不是打印 ''Shoes''、''Loffers'' 和 ''Joggers''

这是更新的代码:

int index_stock=0; //defined globally so I can access anywhere
choice_1:
    printf("\n\n\t\t===================================");
    printf("\n\t\tHow many Entries you want to make to the stock: ");
    scanf("%d", &entry);
    system("cls");
    for(i=index_stock;i<entry;i++)
    {
        printf("\n\t\tEnter Item - %d Name: ",i+1);
        scanf("%s",stock_[i].item_name);
        printf("\t\tEnter its Rate(price per 1 item): ");
        scanf("%f", &stock_[i].item_rate);
        printf("\t\tEnter its Quantity: ");
        scanf("%d", &stock_[i].item_quantity);
        printf("\t\tStock Updated Successfully!");
        printf("\n\n\t\t===================================");
        index_stock=i //updated the index_stock with last value of i as suggested by @Andy Newman
    }
choice_3:
    printf("\n\n\t\tPress 1 to Add another item to Stock\n\t\tPress 2 to go to Stock Menu\n\t\tPress 3 to go to Main Menu\n\t\tPress 4 to Exit Program\n\t\t->Please make a choice: ");
    int choice_s_;
    scanf("%d", &choice_s_);
    if(choice_s_==1)
    {
        system("cls");
        goto choice_1;
    }

编辑 2: 我正在更新 for 循环内的 index_stock 值,将其带到循环外并将 for 循环更改为(@Bodo 建议):

for (i = index_stock; (i < index_stock + entry) && (i < (sizeof(stock) / sizeof(stock[0]))); i++)

它奏效了!

标签: c

解决方案


您的 for 循环从 0 变为任何值。每次。如果您想从其他地方开始,您需要记住其他地方在哪里,这意味着您需要一个变量。有很多选择,但经验告诉我应该存储数组的长度(不是 99,而是实际存储在其中的项目数)。

length = 0;
...
for (i=length; ...)
...
length = i;

推荐阅读