分からないことがあります

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
YUU

分からないことがあります

#1

投稿記事 by YUU » 14年前

次のプログラムを実行して、追加を選択するとリストと終了が選択できなくなります。
どうしたらいいのか教えてください。


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

#define NAME_SIZE 100

typedef struct item item_t;

struct item {
int no;
char name[NAME_SIZE];
int prise;
item_t *previous;
};

enum {
ADD = 1,
LIST,
END
};

item_t *AddItem(item_t *item);
void ListItem(item_t *item);
void FreeItem(item_t *item);
int main(void);

/* item を追加して、追加した item へのポインタを返す */
item_t *AddItem(item_t *item)
{
item_t *p;
char temp[256];
int x;

if ((p = (item_t *)calloc(1, sizeof(item_t))) == NULL) {
fprintf(stderr, "メモリ アロケーション エラー\n");
exit (2); /* メモリ割り当てに失敗したら、シェルに戻る */
}

(*p).no = (*item).no + 1; /* item 番号を設定 */

printf("No %d 商品名を入力して下さい ", (*p).no);
scanf("%s", temp);
strcpy((*p).name, temp);
printf("値段を入力して下さい ");
scanf("%d", &x);
(*p).prise = x;

printf("\nNo %d 商品名:%s 値段:%d を追加しました\n",
(*p).no, (*p).name, (*p).prise);

p->previous = item; /* 一つ前の構造体を指すようにする */
return (p); /* 追加した構造体へのポインタを返す */
}


/* item を表示後、メモリを解放し、一つ前のitem へのポインタを返す*/
/* item がなければ受け取ったポインタをそのまま返す */
item_t *DelItem (item_t *item)
{
item_t *p;

if (item->previous != NULL) {
printf("\nNo %d 商品名:%s 値段:%d を削除しました\n",
(*item).no, (*item).name, (*item).prise);

p = item->previous; /* free( ) を実行する前に実行 */

free(item);
return (p);
}
else {
printf("\nアイテムがありません!\n");/* item がなければ */
return (item); /* 受け取ったポインタをそのまま返す */
}
}
/* 登録されている item を全て表示 */
void ListItem(item_t *item)
{
while (item->previous != NULL) {
printf("\nNo %d 商品名:%s 値段:%d\n",
(*item).no, (*item).name, (*item).prise);
item = item->previous;
}
}

/* calloc( ) で割り付けられたメモリの解放 */
void FreeItem(item_t *item)
{
item_t *previous;

while (item->previous != NULL) {
previous = item->previous;
free(item);
item = previous;
}
}

int main(void)
{
item_t *item;
char buff[256];
int n;

if ((item = (item_t *)calloc (1, sizeof(item_t))) == NULL) {
fprintf(stderr, "Memory Allocation Error\n");
exit(2); /* メモリ割り当てに失敗したら、シェルに戻る */
}

(*item).no = 0;
item->previous = NULL;

for (;;) {
printf("1: 追加 3: リスト 4: 終了\n");
fflush(stdin);
fgets(buff, sizeof(buff), stdin);
if(!sscanf(buff, "%d", &n))
continue;
switch (n) {
case (ADD):
item = AddItem(item);
break;
case (LIST):
ListItem(item);
break;
case (END):
FreeItem(item);
exit(0);
default:
continue;
}
}
}

Wings

Re:分からないことがあります

#2

投稿記事 by Wings » 14年前

for (;;) {
printf("1: 追加 3: リスト 4: 終了\n");
fflush(stdin);
fgets(buff, sizeof(buff), stdin)
以下つづく...

------------------------------------------------------------------------
printf("1: 追加 3: リスト 4: 終了\n")

要求している数字が間違っているようです。
正しくは、
printf("1: 追加 2: リスト 3: 終了\n")

のように、宣言しているenumのADD( = 1 ),LIST( = 2 ),END( = 3 )
に合わせなければならないのではないでしょうか。

閉鎖

“C言語何でも質問掲示板” へ戻る