目前我正在制作一个存储程序,但是当我已经添加一个项目时它仍会打印1。有人能告诉我这段代码有什么问题吗?
方向:输入存储(1-10)输入1 - >添加项目(输入任何内容) - >返回主菜单 - >显示项目
#include <stdio.h>
#include <stdlib.h>
struct info1
{
int quantity2;
char name[60];
};
int main(void)
{
start: ;
struct info1 item1;
struct info1 item2;
struct info1 item3;
struct info1 item4;
struct info1 item5;
struct info1 item6;
struct info1 item7;
struct info1 item8;
struct info1 item9;
struct info1 item10;
int quantity1, mainmenu;
item1.quantity2 = 0;
item2.quantity2 = 0;
item3.quantity2 = 0;
item4.quantity2 = 0;
item5.quantity2 = 0;
item6.quantity2 = 0;
item7.quantity2 = 0;
item8.quantity2 = 0;
item9.quantity2 = 0;
item10.quantity2 = 0;
printf("\n==Storage==");
printf("\n\nInput Storage (1-10) : ");
scanf("%d", &quantity1);
printf("\nMain Menu\n1.Add Item\n2.Show Item\n3.Search Item\n4.Exit\n");
scanf("%d", &mainmenu);
if (quantity1 == 1)
{
if (mainmenu == 1)
{
printf("\nItem Name : ");
scanf("%s", item1.name);
fflush(stdin);
printf("\nItem Quantity : ");
scanf("%d", &item1.quantity2);
}
else if (mainmenu == 2)
{
printf("\n==Item List==");
if (item1.quantity2 == 0)
{
printf("\n1. - ");
}
else if (item1.quantity2 > 0)
{
printf("\n1. %s %d pcs", item1.name, item1.quantity2);
}
}
}
goto start;
}
答案 0 :(得分:3)
本质上你的程序有这个结构
int main(void)
{
start: //doesn't need ';'
struct info1 item1; //declared something
int quantity1, mainmenu;
//... and other setup
//then some stuff you want to do over and over again
goto start;
}
但是,您希望继续使用这些值,因此不想重新开始。 你真正想做的是回到菜单(然后考虑稍后退出)。
所以这个结构:
int main(void)
{
struct info1 item1; //declared something
int quantity1, mainmenu;
//... and other setup
start: //MOVED
//then some stuff you want to do over and over again
goto start;//like where we set stuff up we don't actually want to re-setup - oops!
}
即。在你的代码中
int main(void)
{
struct info1 item1;
//... other stuff...
printf("\n==Storage==");
printf("\n\nInput Storage (1-10) : ");
scanf("%d", &quantity1);
start: //<------- more a loop than a start
printf("\nMain Menu\n1.Add Item\n2.Show Item\n3.Search Item\n4.Exit\n");
scanf("%d", &mainmenu);
//... menu code
//...
goto start;
}
有些人说使用goto是一个坏主意。 我们可以使用循环代替:
int main(void)
{
struct info1 item1;
// etc
int quantity1=0, mainmenu=0; //,- initialise!
item1.quantity2 = 0;
// etc
printf("\n==Storage==");
printf("\n\nInput Storage (1-10) : ");
scanf("%d", &quantity1);
while (mainmenu != 4) //<- stop when the user says 4 for exit
{
printf("\nMain Menu\n1.Add Item\n2.Show Item\n3.Search Item\n4.Exit\n");
scanf("%d", &mainmenu);
if (quantity1 == 1)
{
//etc
}
}
}
答案 1 :(得分:0)
它反复打印1,因为goto
使它从start
(即程序开头)运行,所以每次都做同样的事情。没有循环计数器,您始终在同一个 item1
对象上工作。
看起来你需要存储一些值 - 使用数组而不是手动声明10个项目。此外,您需要循环遍历该数组。
我建议你阅读一些decent book或者看看一些教程。