#include int getchardec(unsigned char *input); char* chgrdx(unsigned char input, char *buf, int rdx); void left(unsigned char *input); void right(unsigned char *input); void revers(unsigned char *input); int command(void); void keyflush(int input); /* ----- 滅入ん ----- */ void main() { unsigned char input; int c; char buf[9]; /* 数字変換用 unsigned char だと 8 + 1 必要 */ printf("0 〜 255 の整数を入力:"); /* 数値を入力 */ if (getchardec(&input) < 0) { printf("エラー:入力が不正です!\n"); return; } do { /* とりあえづ無限ループで */ printf("10進数:%s ", chgrdx(input, buf, 10)); printf("16進数:%s ", chgrdx(input, buf, 16)); printf("2進数:%s\n", chgrdx(input, buf, 2)); printf("コマンドを入力 (L, R, X, E):"); /* コマンド入力待ち */ if ((c = command()) < 0) { printf("コマンドが不正です!\n"); continue; } switch (c) { case 1: /* 左シフト */ left(&input); break; case 2: /* 右シフト */ right(&input); break; case 3: /* bit 反転 */ revers(&input); break; case 4: /* 終了 */ return; } } while (1); } /* ----- 関数の定義 ----- */ int getchardec(unsigned char *input) { unsigned int c; unsigned int ans = 0; if ((c = getchar()) == '\n') { return -1; /* 改行のみが入力されたっぽいし */ } while (c != '\n') { if (c >= '0' && c <= '9') { ans = ans * 10 + (c & 0x0F); /*ans = ans * 10 + (c - '0');*/ } else { return -2; /* 文字以外の入力があった */ } c = getchar(); /* 1 文字入力して繰り返しおつ〜 */ } if (ans > 255) { return -3; /* 入力範囲値を超えている */ } *input = (unsigned char)ans; /* 変換結果を返す */ return 0; /* 正常終了 */ } char* chgrdx(unsigned char input, char *buf, int rdx) { unsigned char keta; /* 桁数 */ unsigned char i; /* 月並みな変数 */ char code[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; if (input == 0) { /* 数値が 0 の時は '0' をバッファに格納 */ buf[0] = '0'; buf[1] = '\0'; } else { /* それ以外は数値を文字列に変換してバッファに格納 */ i = input; /* input の値は後に使いたい */ for (keta = 0; i / rdx > 0 || i % rdx; keta++) { /* 桁数を数えてみる */ i /= rdx; } for (i = keta; i > 0; i--) { /* バッファの後ろから格納するる */ buf[i - 1] = code[input % rdx]; /* 数値を文字に変換 */ input /= rdx; } buf[keta] = '\0'; /* ASCIIZ 文字列にする */ } return buf; } void left(unsigned char *input) { *input <<= 1; /* 左シフト */ } void right(unsigned char *input) { *input >>= 1; /* 右シフト */ } void revers(unsigned char *input) { *input ^= 0xFF; /* bit 反転 */ } int command(void) /* コマンドの解釈 */ { int ans; int c; c = getchar(); /* 1 文字読み込む */ if (c == '\n') { /* 改行なの? */ return -1; } c |= 0x20; /* 大文字だったら小文字にしておく */ switch (c) { case 'l': /* 'L' のときね */ ans = 1; break; case 'r': /* 'R' のときね */ ans = 2; break; case 'x': /* 'X' のときね */ ans = 3; break; case 'e': /* 'E' のときね */ ans = 4; break; default: /* それ以外は不正な入力 */ keyflush(c); return -1; } c = getchar(); /* 念のために次の文字も確認するる */ if (c != '\n') { /* 改行以外はダメだよ〜ん */ keyflush(c); return -1; } return ans; /* 正常終了 */ } /* --- 入力バッファのクリア簡易版 --- */ void keyflush(int input) { while (input != '\n') { input = getchar(); } }