#include #include int myatoi(char *); int main() { char str[20]; int ival, year; printf("和暦(S45, R6等): "); scanf("%s", str); /* "H11"のような文字列 */ ival = myatoi( &str[1] ); /* [1]として先頭1文字を飛ばすのがポイント */ if (ival == 0) { printf("数字を読み取れません\n"); /* エラー処理 */ exit (2); } if ( str[0]=='R' ) year = 2018 + ival; /* 令和 */ else if ( str[0]=='H' ) year = 1988 + ival; /* 平成 */ else if ( str[0]=='S' ) year = 1925 + ival; /* 昭和 */ else if ( str[0]=='T' ) year = 1911 + ival; /* 大正 */ else if ( str[0]=='M' ) year = 1867 + ival; /* 明治 */ else { printf("%cに対応する元号が存在しません\n", str[0]); exit (1); } printf("西暦 (AD): %d\n", year); return 0; } /********************************************************************** myatoi 引数文字列から整数を読み取り、int型にして返す関数。1桁も読めない場合は0が返る。 先頭のスペースは読み飛ばす。 次に-符号が来れば、負の整数を返す。+符号ならそのまま読み取った整数を返す。 あとは連続する数字を読み、数字以外に出会えば終了。 **********************************************************************/ int myatoi(char *str) { int i; int sgn=1, val=0; /* valは0に初期化しておく */ /* 先頭のスペースはスキップ */ for ( i=0; str[i]!='\0'; i++ ){ if ( str[i]!=' ' ) break; } /* +-符号のチェック */ if ( str[i]=='-' ) { sgn = -1; /* 後で-1倍できるように変数に保持 */ i++; } else if ( str[i]=='+' ) { i++; /* +の場合は何もせず1文字スキップ */ } /* 連続する数字の読み取り */ while (1) { if ( str[i]>='0' && str[i]<='9' ) { val = val*10 + (int)(str[i] - '0'); /* 左に一桁ずらし、読み込んだ数字を足す */ i++; } else break; /* 数字以外(ヌル文字も)なら読み込み終了 */ } return sgn*val; /* -符号があった場合は-1倍して戻り値とする */ }