#include #include #define MAXSTR 10 /* 名前の長さ */ #define MAXENT 10 /* 件数 */ int con_gets2(char* str, int buf_size); void keyflush(int input); int usort(char* str, int entry, int size); int cmpstr(char* str, int size); int chgstr(char* str, int size); /* ----- 滅入ん ----- */ void main() { int i; int entry = 0; char str[MAXENT][MAXSTR + 1]; printf("%d 文字以内で氏名を入力してください (%d件)\n", MAXSTR, MAXENT); for (i = 0; i < MAXENT; i++) { if (con_gets2(str[i], MAXSTR + 1) == EOF) { break; } printf("累計件数:%d 件\n", ++entry); } printf("----------\n"); if (usort(str[0], entry, MAXSTR + 1) == NULL) { printf("メモリ不足らしい\n"); } for (i = 0; i < entry; i++) { printf("[%s]\n", str[i]); } } /* ----- 関数の定義 ----- */ /* ---- キーボードから文字列を入力 ---- */ /* 行頭で '0' が入力されると EOF を返す */ /* それ以外は 1 を返す */ int con_gets2(char* str, int buf_size) { int cnt = 0; int flag = 1; char ch; while ((ch = getchar()) != '\n') { /* '\n' が出現するまで繰り返し */ if (flag && ch == '0') { /* 行頭で '0' が入力された場合 */ keyflush(ch); return EOF; } else { flag = 0; } if (cnt < buf_size - 1) { /* 改行待ちなんでバッファクリアは考慮していない */ *(str + cnt) = ch; cnt = cnt + 1; } } *(str + cnt) = '\0'; return 1; } void keyflush(int input) { while (input != '\n') { /* 入力バッファのクリア簡易版 */ input = getchar(); } } /* 概要:配列を並べ替える関数 (Buble sort) */ /* 引数:char* str 配列のポインタ, int entry 配列の要素数, int size 要素のサイズ */ /* 返値:成功 = 1, 失敗(メモリ不足など) = NULL (0) */ int usort(char* str, int entry, int size) { int i; char tmp; while (entry > 1) { i = 0; while (i < entry - 1) { if (cmpstr(str + (size * i), size) == 1) { if (chgstr(str + (size * i), size) == NULL) { return NULL; } } i++; } entry--; } return 1; } /* 概要:配列を比較する関数 (それぞれが連続した配列で渡す) */ /* 引数:char* str 配列のポインタ, int size 要素のサイズ */ /* 返値:A > B の時 = 1, A == B の時 = 0, A < B の時 = -1 */ int cmpstr(char* str, int size) { int i; for (i = 0; i < size; i++) { if (*(str + i) != *(str + i + size)) { if (*(str + i) > *(str + i + size)) { return 1; } else { return -1; } } } return 0; } /* 概要:配列を入れ替える関数 */ /* 引数:char* str 配列のポインタ, int size 1 要素のサイズ */ /* 返値:成功 = 1, 失敗(メモリ不足など) = NULL (0) */ int chgstr(char* str, int size) { char* p; int i; p = malloc(size); /* 1 配列の長さ分のメモリ確保 */ if (p == NULL) { /* 確保できないらしいし */ return NULL; } for (i = 0; i < size; i++) { /* 配列の入れ替え */ *(p + i) = *(str + i); /* バッファに A をコピー */ *(str + i) = *(str + i + size); /* A に B をコピー */ *(str + i + size) = *(p + i); /* B にバッファをコピー */ } free(p); return 1; }