1

私は今日、自分のプログラムについて一般的な懸念を持っています。私はこの 1 つのプログラムにかなりの時間 (最終試験に向けて勉強できる時間) を費やしてきましたが、少し距離を置く必要があると感じています。プログラムを実行しようとすると、これらのエラーが表示されます。

lines 115, 120, 131, 136, 146:
  warning: passing argument 1 of 'strcmp' makes pointer from integer without a cast
  note: expected 'const char *' but argument is of type 'int'

(これは進行中の作業であり、あまり機能することを意図したものではないことに注意してください。ただし、他に何か見た場合はお知らせください)

私のクラスには非常に興味深い教授がいて、同じように興味深い方法で教えているので、このプログラムの要件のいくつかの側面を理解するのに苦労しました. あなたが提供できるどんな助けも大歓迎です。前もって感謝します

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAX_ITEMS 1000


struct drink {
int drinkNum;
double drinkPrice;
}drinklist[10];

struct items {
double itemPrice;
};

struct raffle {
double rafValue;
};

int main(){
double preTickets, doorTickets, minBid;
int preSold, numItems, rafTickets = 0, rafPrizes, rafCost;

int i, numEvents, x;

FILE* fin;
fin = fopen("input.txt", "r");

// Line#1 from input file
fscanf(fin, "%lf %lf %d", &preTickets, &doorTickets, &preSold);

// Line#2 from input file
fscanf(fin, "%d %lf", &numItems, &minBid);

// This allocates space for the list of auction items dynamically. 

struct items* itemList = (struct items*)malloc(sizeof(struct items)*numItems);

// Line#3 from input file.
for(i = 0; i < numItems; i++){
    fscanf(fin, "%lf", &itemList[i].itemPrice);
}

// Line#4 fron input file.
fscanf(fin, "%d %d %d", &rafTickets, &rafCost, &rafPrizes);

// Same as the itemList. Creates enough space for the number of raffle prizes you need.
struct raffle* raffleList = (struct raffle*)malloc(sizeof(struct raffle)*rafPrizes);


// Line#5 from input file
for(i = 0; i < rafPrizes; i++){
    fscanf(fin, "%lf", &raffleList[i].rafValue);
}

struct drink drinklist[10];

// Line#6 from input file
for(i = 0; i < 10; i++){
    fscanf(fin, "%d", &drinklist[i].drinkNum);
}

 // Line#7 from input file
for(i = 0; i < 10; i++){
    fscanf(fin, "%lf", &drinklist[i].drinkPrice);
}

// This just prints out the output that has been read in so far.
// This will also show you how you can refer to the different members of data that you need later.
printf("%.2lf %.2lf %d\n", preTickets, doorTickets, preSold);
printf("%d %.2lf\n", numItems, minBid);

for(i = 0; i < numItems; i++){
    printf("%.2lf ", itemList[i].itemPrice);
}

printf("\n%d %d %d\n", rafTickets, rafCost, rafPrizes);

for(i = 0; i < rafPrizes; i++){
    printf("%.2lf ", raffleList[i].rafValue);
}

printf("\n");
for(i = 0; i < 10; i++){
    printf("%d ", drinklist[i].drinkNum);
}
printf("\n");
for(i = 0; i < 10; i++){
    printf("%.2lf ", drinklist[i].drinkPrice);
}
printf("\n");

// This frees the memory that you allocated dynamically.
free(itemList);
free(raffleList);


// loop that runs from from 0 to < numCommands and read in each command and evaluate it.

fscanf(fin, "%d", &numEvents);
fclose(fin);

int actLoop, boughtTickets, boughtRaffle, boughtDrink;
int itemPrice, currentBid, guestBid, bidOffer;
int guestRaf;
int drinkWanted;

for (actLoop=0; actLoop<numEvents; actLoop++); {

int action;

fscanf(fin, "%s", action);

if (strcmp(action, "BUY TICKET") == 0) {
    fscanf(fin, "%d", boughtTickets);
    printf("Sold tickets %d - %d", &preSold+1, &preSold+boughtTickets);
}

else if (strcmp(action, "BIDITEM") == 0) {
    fscanf(fin, "%d%d%.2lf", &itemList[i], &guestBid, &bidOffer);

    if (bidOffer < itemList[i].itemPrice + minBid) {
        printf("Bid for item %d rejected for person %d at %.2lf", &itemList[i], &guestBid, &bidOffer);
    }
    else
        printf("Bid for item %d accepted for person %d at %.2lf", &itemList[i], &guestBid, &bidOffer);
        itemList[i].itemPrice == bidOffer;
}

else if (strcmp(action, "CLOSEAUCTION") == 0) {

}


else if (strcmp(action, "BUY RAFFLE") == 0) {
    fscanf(fin, "%d%d", &boughtRaffle, &guestRaf);
    if (boughtRaffle > rafTickets) {
        boughtRaffle == rafTickets;
        rafTickets = rafTickets - boughtRaffle;
    }
        printf("Raffle Tickets %d - %d given to person %d", &rafTickets, &rafTickets+boughtRaffle, &guestBid);

}

else if (strcmp(action, "BUY DRINK") == 0) {
    fscanf(fin, "%d%d", &drinkWanted, &drinklist[i].drinkNum);
    if (drinklist[i].drinkNum < drinkWanted) {
        drinkWanted = drinklist[i].drinkNum - drinkWanted;
    }
    printf("Sold %d of drink %d", &drinklist[i].drinkNum, &drinkWanted);
        drinklist[i].drinkNum = drinklist[i].drinkNum - drinkWanted;

}
}
}
4

2 に答える 2

3

文字列を に読み込んでいます。代わりに配列intを使用する必要があります。char

char action[200];
fscanf(fin, "%199s", action);

そして、ここであなたはのアドレスが必要ですboughtTickets

fscanf(fin, "%d", &boughtTickets);

ここでは、変数の値ではなくアドレスを出力しています。

printf("Sold tickets %d - %d", &preSold+1, &preSold+boughtTickets);

K&R をお勧めする良い C の本を読んでください。

于 2012-12-01T18:55:33.580 に答える
1

strmp文字列を別の文字列と比較しますが、プログラムではint( action) を文字列と比較しています。

またfscanf(fin, "%s", action); fscanf、ファイル入力記述子から文字列を読み取るfinため、のタイプはactionchar バッファーにする必要があります

char action[256];

fscanf(fin, "%s", action);

if (strcmp(action, "BUY TICKET") == 0) {
于 2012-12-01T18:55:12.543 に答える