2017-01-26 35 views
-3

目前我正在製作一個存儲程序,但它仍然打印1,當我已經添加一個項目。有人能告訴我這段代碼有什麼問題嗎?爲什麼此代碼仍然打印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

有* *少數情況下,標籤和'goto'可以使用。使用它而不是循環是*不*這些情況之一。另外,在輸入流中調用'fflush'就像'stdin'一樣,在C規範中明確提到了* undefined behavior *。 –

+0

你有沒有聽說過陣列? –

+0

@StorryTeller對不起,這是我第一次在這裏發佈xD – RyvH

回答

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 
     } 
    } 
} 
0

它打印1一遍又一遍,因爲goto使得它從start運行(也就是在程序的開始),所以每次你在做同樣的事情。沒有循環計數器,你總是在同一個item1上工作對象。

看起來你需要存儲一些值 - 使用數組而不是手動聲明10個項目。此外,您還需要遍歷該數組。

我建議你閱讀一些decent book或看看一些教程。

相關問題