c - 我试图遍历一个结构数组,并在我再次调用该函数(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++)
它奏效了!
解决方案
您的 for 循环从 0 变为任何值。每次。如果您想从其他地方开始,您需要记住其他地方在哪里,这意味着您需要一个变量。有很多选择,但经验告诉我应该存储数组的长度(不是 99,而是实际存储在其中的项目数)。
length = 0;
...
for (i=length; ...)
...
length = i;
推荐阅读
- c# - 使用自定义模型绑定器指示模型的绑定源?
- javascript - JS 中的单个事件监听器 VS 多个 VS 多个 on() 辅助函数
- javascript - 获取新的类实例作为默认道具
- javascript - 强制浏览器渲染具有整数像素的元素
- c# - 哪些 c# 功能区元素允许下拉键提示?
- go - Go 中的 Gorm 库有一个 AfterFind-hook。是否可以选择是否在查询方法上自动调用此钩子?
- excel - 在服务器中存储一个 exel 文件并使用它的功能
- python - 在 Jupyter 中导入 Tensoflow 的问题。DLL 加载失败。特定模块加载失败
- javascript - 杀死 discord.js 中的命令处理程序脚本
- azure - 使用 azure 函数应用程序 VNET 集成将 JSON 发送到 privateEndpoint azure