#include /* ----- ニュ^h^hプロトタイプ宣言 ----- */ void printd1(char* p, int a); void print(char* p); void int2str(char* buf, int a); void keyflush(int input); void con_gets(char* str, int buf_size); int getdec(int* ans, int keta); /* ----- 滅入ん ----- */ void main() { char format[21]; char buf[12]; int ans; do { printf("書式を入力:"); con_gets(format, 20); printf("数値を入力:"); if (getdec(&ans, 10) == -1) { printf("Error!:整数を入力して下さい\n"); break; } int2str(buf, ans); printd1(format, ans); putchar('\n'); } while (0); } /* --- 関数群 --- */ /* --- 今日の本題的な printf モドキな関数 */ void printd1(char* p, int a) { int i; char buf[12]; /* 数値 → 文字列変換用バッファ (符号も考慮して少し多め) */ for (i = 0; i < 10; i++) { /* 書式は 10 文字までって仕様らしい */ if (p[i] == '\0') { /* '\0' が出たら抜ける */ break; } if (i < 10 - 1) { /* 最後の桁でバッファを越えないように考慮する */ if (p[i] == '%' && p[i + 1] == 'd') { /* 1 文字目が '%' でその次が 'd' を探す */ int2str(buf, a); print(buf); i++; /* 1 文字スキップ */ } else if (p[i] == '\\') { /* 1 文字目が '\' を探す */ /* switch (p[i + 1] | 0x20) { */ switch (p[i + 1]) { case 'n': putchar('\n'); break; case 't': putchar('\t'); break; default: putchar(p[i + 1]); /* '\' 直後の 1 文字のみ表示 */ } i++; /* 1 文字スキップ */ } else { /* 書式が見当たらない場合はココ */ putchar(p[i]); /* ごく普通の表示 */ } } else { putchar(p[i]); /* この場合の 10 文字目は無条件で表示 */ } } } /* --- ただ単に文字列を片っ端から表示する --- */ void print(char* p) { int i = 0; do { if (p[i] == '\0') { break; } putchar(p[i]); i++; } while (1); } /* --- 数値を文字列に変換できるといいなぁ --- */ /* --- buf は 12byte くらい必要みたいです --- */ void int2str(char* buf, int a) { int keta; /* 桁数 */ int sign = 0; /* 負数を示す変数 */ int i; /* 月並みな変数 */ if (a < 0) { /* 負数の場合は '-' を格納しておく */ buf[0] = '-'; sign = 1; /* バッファのオフセット値ってカンジ? */ a *= -1; /* 整数に直しておく */ } if (a == 0) { /* 数値が 0 の時は '0' をバッファに格納 */ buf[0] = '0'; buf[1] = '\0'; } else { /* それ以外は数値を文字列に変換してバッファに格納 */ i = a; /* a の値は後に使いたい */ for (keta = sign; i / 10 > 0 || i % 10; keta++) { /* 桁数を数えてみる */ i /= 10; } for (i = keta; i > sign; i--) { /* バッファの後ろから格納するる */ buf[i - 1] = (a % 10) + '0'; a /= 10; } buf[keta] = '\0'; } } /* --- 入力バッファのクリア簡易版 --- */ void keyflush(int input) { while (input != '\n') { input = getchar(); } } /* --- キーボードから文字列を入力 --- */ void con_gets(char* str, int buf_size) { int cnt = 0; char ch; while ((ch = getchar()) != '\n') { /* '\n' が出現するまで繰り返し */ if (cnt < buf_size - 1) { /* 改行待ちなんでバッファクリアは考慮していない */ *(str + cnt) = ch; cnt = cnt + 1; } } *(str + cnt) = '\0'; } /* --- キーボードから数字を入力し整数に変換するる --- */ int getdec(int* ans, int keta) { int input; /* 1 文字入力の値 */ int sign = 2; /* 最初のループ時:2 整数:0 負数:1 */ int i = 0; /* 繰り返しカウンタ ※ 1 文字読み込んだら増やす */ *ans = 0; /* 文字→数値変換の結果を初期化 */ while ((input = getchar()) != '\n') { i++; /* 繰り返しカウンタを増やす */ if (sign == 2) { /* 符号判定 ※最初の 1 回のみ実行される */ if (input == '-') { /* 負数の時 */ sign = 1; /* 負数フラグ On */ input = getchar(); /* '-' を読み飛ばす */ i++; /* 繰り返しカウンタを増やす */ } else if (input == '\n') { keyflush(input); return -1; /* 行頭での改行はエラー (-1) */ } else { sign = 0; /* 負数フラグ Off */ } } if (i > keta) { /* 繰り返しの判定 */ break; /* 所定回数に達したら抜ける */ } if (input >= '0' && input <= '9') { *ans = (*ans * 10) + (input - '0'); /* 文字数字を 10 進数に変換 */ } else { keyflush(input); return -1; /* 数字以外の入力ならエラー (-1) */ } } if (sign == 2) { /* 改行だけの入力はエラー */ keyflush(input); return -1; } if (sign) { *ans *= -1; /* 負数の時はそんな感じで */ } keyflush(input); return 0; }