/****************************************************************************** 配列へのデータの追加・配列からのデータの削除 ******************************************************************************/ #include #include #include #define OK 1 #define YES 1 #define NO 0 struct data { /* Data 型を定義 */ char *string; /* 文字列データ */ int number; /* 数値データ */ }; typedef struct data Data; /* struct data を Data と呼ぶ */ #define N 20 /* 配列の大きさ */ #define BUFSIZE 1024 /* バッファの大きさ */ Data a[N]; /* Data 型の配列 */ int arraysize; /* 配列に実際に保持されているデータ数 */ int Data_addarray(Data *p, int *arraysize, Data *q); void Data_deletearray(Data *p, int *arraysize, int i); int Data_read(Data *p, FILE *in); void Data_printarray(Data *p, int size); void Data_print(Data *p); int main() { static char buf[BUFSIZE+1]; do { printf("> "); /* プロンプト */ fgets(buf, BUFSIZE, stdin); /* ユーザがキーボード入力 */ if (buf[0] == 'q') { /* 一文字目が q なら終了 */ break; } else if (buf[0] == 'p') { /* p なら全体を印字 */ Data_printarray(a, arraysize); } else if (buf[0] == 'a') { /* a ならデータ追加 */ Data tmp; printf("「作曲家名tab生年」のスタイルで入力せよ.\n"); Data_read(&tmp, stdin); if (Data_addarray(a, &arraysize, &tmp) == NO) { fprintf(stderr, "配列がいっぱいです.\n"); } } else if (buf[0] == 'd') { /* d ならデータ削除 */ int t; printf("何番目?\n"); fgets(buf, BUFSIZE, stdin); /* ユーザが入力 */ t = atoi(buf); if (t >= arraysize) { printf("範囲外です.\n"); } else { Data_deletearray(a, &arraysize, t); } } else { printf("入力エラーです.\n"); } } while (1); return 0; } /* FILE *in から Data *p へ Data 型オブジェクトを読み込む。成功 OK / 失敗 NO */ int Data_read(Data *p, FILE *in) { int j; static char buf[BUFSIZE+1]; /* 一行ずつ処理するためのバッファ */ if (fgets(buf, BUFSIZE, in) == NULL) { return NO; /* 読み込めなかった場合 */ } for (j=0; buf[j] != '\t'; j++) { /* タブをさがす */ ; } p->string = malloc(j+1); /* メモリを要求 */ if (p->string == NULL) { fprintf(stderr, "メモリが足りません.\n"); return NO; } buf[j] = '\0'; strcpy(p->string, buf); /* 文字列をコピー */ while (buf[++j] == '\t') { /* タブをスキップ */ ; } p->number = atoi(buf+j); /* 数値データを読み込む */ return OK; } /* 配列 p に *p を加える。配列がいま保持しているデータ数は *arraysize 個。*/ int Data_addarray(Data *p, int *arraysize, Data *q) { if (*arraysize == N) { return NO; /* いっぱいのとき */ } else { p[(*arraysize)++] = *q; return OK; } } /* 配列 p の i 番目の要素を削除。それ以降のデータは前につめる */ void Data_deletearray(Data *p, int *arraysize, int i) { free(p[i].string); /* malloc() で割り当てたメモリの解放 */ (*arraysize)--; while (i < *arraysize) { p[i] = p[i+1]; i++; } } /* Data の配列 p[0], ..., p[size-1] を印字。何番目かも印字する */ void Data_printarray(Data *p, int size) { int i; printf("%d 個あります.\n", arraysize); for (i=0; istring, p->number); }