0

更新したいアレイがいくつかあります。問題は、データが配列に追加されると、一部の変数が0に更新されることです。

データを追加するための私のコード:

void addStockItem(){
    system(CLS_NAME);
    printf("New Item\n\n");
    printf("New Item Name   : ");
    fflush(stdin);
    scanf(" %[^\n]s",&*itemName[totalItem]);
    //itemName[totalItem][30] = strupr(itemName[totalItem]);
    fflush(stdin);
    printf("New Item Price  : ");
    scanf("%f",&item_Price_Profit[totalItem][0]);
    printf("New Item Profit : ");   
    scanf("%f",&item_Price_Profit[i][1]);
    printf("New Item Qty    : ");   
    scanf("%d",&itemQuantity[totalItem][0]);
    itemQuantity[totalItem][1]=0;
    itemQuantity[totalItem][2]=0;
    ++totalItem;
    allStocks();
}

データ、

int totalItem=13,itemQuantity[][3]={8,0,0,9,0,0,11,0,0,0,0,0,20,0,0,22,0,\
  0,16,0,0,18,0,0,9,0,0,7,0,0,5,0,0,12,0,0,0,0,0},sessionQuantity;

float item_Price_Profit[][2]={1,0.5,2,0.2,3,0.2,4,0.2,5,0.5,6,0.8,7,0.5,8,0.2,9,\
0.2,10,0.2,11,0.5,12,0.8,13,0.9};

char itemName[][30]={"STABILO PENCIL 2B","STABILO PEN 0.5",\
"STABILO ERASER","STABILO RULER","STABILO TEST PAD","STABILO BOOK","STABILO SCISSORS","STABILO SHARPENER","STABILO GLUE","STABILO CHALK","STABILO MARKER PEN","OXFORD DICTIONARY","STABILO HIGHLIGHTER"};

完全なコード: http: //pastebin.com/jjuCCrjz

[編集]itemQuantity[][3]をitemQuantity[100][3]に、item_Price_Profit[][2]をitem_Price_Profit[100][2]に、itemName [] [30]をitemNameに変更した後、すべてが意図したとおりに機能します[100][30]。scanf以外の私の間違いは何でしょうか?

4

2 に答える 2

3

職場のパソコンからはペーストビンにアクセスできないので、投稿されたものを見ていきます。

すぐに使えるいくつかの問題:

  1. fflush入力ストリームではなく、出力ストリームでのみ機能するように定義されています。の動作fflush(stdin)未定義です(何かを行いますが、おそらくあなたが望むものではありません)。入力ストリームからガベージをクリアする必要がある場合は、ガベージをクリアしたことを示す改行またはその他のインジケーターが表示されるまで、または同様のgetchar()方法でそれを消費する必要があります。および変換指定子は、先頭の空白をスキップします。また、変換指定子の前に空白fgets()があると、先頭の空白もスキップされます。したがって、電話は完全に捨ててください。 %f%d%[fflush

  2. scanf(" %[^\n]s",&*itemName[totalItem]);- これは混乱しているように見えます。入力の末尾に常にs文字があると思われる場合を除き、変換指定子は単純に%[^\n]. の&*itemNameは冗長です。あなたはただ書く必要があります

    scanf(" %[^\n]", itemName[totalItem]);
    おそらくそこにフィールド幅指定子を入れる必要がありますが:
    scanf(" %30[^\n]", itemName[titalItem]);
    バッファオーバーフローを避けるため。

  3. totalItemすべてのデータ項目 ( 、itemNameitem_Price_Profitなど) にグローバル変数としてアクセスしています。これは通常、胸焼けのレシピです。理想的には、関数とその呼び出し元は、グローバルを介して状態を共有すべきではありません。むしろ、パラメーター、戻り値、および例外 (サポートされている場合) を介して通信する必要があります。もっと似たもの

    void addStockItem(char *name, float *price, float *profit, float *quantity)
     {
       ...
       scanf(" %30[^\n]", 名前);
       ...
       scanf("%f", 価格);
       ...
       scanf("%f", 利益);
       ...
       scanf("%d", 数量);
     }
    これは次のように呼ばれます
    addStockItem(itemName[totalItem],
                  &item_Price_Profit[totalItem][0],
                  &item_Price_Profit[i][1],
                  &itemQuantity[totalItem][0]);

  4. あなたのデータ構造は私にとって本当に厄介なように感じますが、それはおそらくあなたのプログラム全体を見ることができないからです.

于 2012-09-28T14:27:25.943 に答える
2

これ:

scanf(" %[^\n]s",&*itemName[totalItem]);

正しくありえない。これは、ポインタに変換された文字を渡します。ここで、文字へのscanf()ポインタが必要です。あなたはおそらく意味します:

scanf(" %[^\n]s", itemName[totalItem]);
于 2012-09-28T14:05:46.203 に答える