Mam kilka tablic, które chciałem zaktualizować. Problem polega na tym, że po dodaniu danych do tablicy niektóre zmienne są aktualizowane do 0.

Mój kod do dodania danych:

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();
}

Dane,

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

Pełny kod: http://pastebin.com/jjuCCrjz

[EDIT] Wszystko działa zgodnie z założeniami po zmianie itemQuantity[][3] na itemQuantity[100][3], item_Price_Profit[][2] na item_Price_Profit[100][2] i itemName[][30] na itemName [100][30]. Co może być moim błędem innym niż scanf?

0
hudadiaz 28 wrzesień 2012, 17:49

2 odpowiedzi

Najlepsza odpowiedź

Nie mogę uzyskać dostępu do Pastebin z mojego komputera służbowego, więc muszę sprawdzić, co zostało opublikowane.

Kilka kwestii od samego początku:

  1. fflush jest zdefiniowany tylko do pracy ze strumieniami wyjściowymi, a nie strumieniami wejściowymi; zachowanie fflush(stdin) jest niezdefiniowane (zrobi coś, ale prawdopodobnie nie to, czego chcesz). Jeśli chcesz usunąć śmieci ze strumienia wejściowego, musisz je wykorzystać za pomocą getchar() lub fgets() lub podobnego, aż zobaczysz nową linię lub inny wskaźnik, że usunąłeś śmieci . Specyfikatory konwersji %f i %d będą pomijać wszelkie wiodące białe znaki, a umieszczenie spacji przed specyfikatorem konwersji %[ spowoduje również pominięcie wszelkich wiodących białych znaków. Więc zrezygnuj z połączeń fflush.

  2. scanf(" %[^\n]s",&*itemName[totalItem]); – wygląda to na zdezorientowane. O ile nie oczekujesz, że dane wejściowe zawsze będą miały końcowy znak s, specyfikatorem konwersji powinien być po prostu %[^\n]. &* przed itemName jest nadmiarowy; musisz tylko napisać

    scanf(" %[^\n]", itemName[totalItem]);
    Chociaż prawdopodobnie powinieneś umieścić tam specyfikator szerokości pola:
    scanf(" %30[^\n]", itemName[titalItem]);
    aby uniknąć przepełnienia bufora.
  3. Masz dostęp do wszystkich swoich elementów danych (totalItem, itemName, item_Price_Profit itp.) jako zmiennych globalnych. Jest to zwykle przepis na zgagę. W idealnym przypadku funkcje i ich wywołujące nie powinny udostępniać stanu za pośrednictwem globalnych; raczej powinny komunikować się za pomocą parametrów, wartości zwracanych i wyjątków (jeśli są obsługiwane). Coś bardziej jak

     void addStockItem(char *name, float *price, float *profit, float *quantity)
     {
       ...
       scanf(" %30[^\n]", name);
       ...
       scanf("%f", price);
       ...
       scanf("%f", profit);
       ...
       scanf("%d", quantity); 
     }
    które można by nazwać jak
     addStockItem(itemName[totalItem], 
                  &item_Price_Profit[totalItem][0], 
                  &item_Price_Profit[i][1], 
                  &itemQuantity[totalItem][0]);
  4. Twoje struktury danych są dla mnie naprawdę nieciekawe, ale prawdopodobnie dlatego, że nie widzę całego twojego programu.

3
John Bode 28 wrzesień 2012, 18:27

To:

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

Nie może mieć racji. Jest to przekazanie znaku przekonwertowanego na wskaźnik, gdzie scanf() oczekuje wskaźnika na znak. Prawdopodobnie masz na myśli:

scanf(" %[^\n]s", itemName[totalItem]);
2
unwind 28 wrzesień 2012, 18:05