2017-01-26 4 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'が使えるのは、ほんのわずかな状況があります。ループの代わりにそれを使用することは、そのような状況ではありません。また、 'stdin'のような入力ストリームで' fflush'を呼び出すことは、Cの仕様で*未定義の動作*と明示的に言及されています。 –

+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; 
} 

後藤を使用することが悪い考えであると言う人たちがあります。 私たちは、代わりにループを使用することもできます。

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

gotoはそれが(それはプログラムの先頭である)startから実行しますので、あなたが同じことを毎回やっているので、それが何度も何度も1を出力します。ループカウンタはありません。は同じitem1オブジェクトで常に動作します。

いくつかの値の数を保存する必要があるように見えます - 手動で10個の項目を宣言する代わりに配列を使用します。また、その配列をループする必要があります。

decent bookを読んだり、いくつかのチュートリアルを見ることをお勧めします。

関連する問題