为什么这段代码仍然打印1,即使我已经添加了项目?

时间:2017-01-26 09:43:43

标签: c

目前我正在制作一个存储程序,但是当我已经添加一个项目时它仍会打印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;
}

2 个答案:

答案 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或者看看一些教程。