ユーザーは誕生日を入力します:月、日、年。もちろん、整数では不十分なので、文字列形式である必要があります。とにかく、特定の誕生日が1年のどの日であるかを見つける必要があります(したがって、1994年5月31日は151日目になります)。ただし、これを行う前に、文字列「MAY」を整数に変換できる必要があります。これらを簡単に解析するにはどうすればよいですか?私はstrcmp()とswitchステートメントまたはifの巨大なブロックを含む巨大な混乱を試みてきましたが、物事はうまくいきたくないようです。プログラムの仕様を変更せずに簡単な方法はありますか?
質問する
77 次
2 に答える
1
月番号に 1..12 を使用し、無効な月名に 0 を使用する 1 つの方法を次に示します。
int GetMonth( char *name )
{
static char *szMonth[13] =
{
"",
"jan", "feb", "mar", "apr", "may", "jun",
"jul", "aug", "sep", "oct", "nov", "dec"
};
int m;
for( m=12; m>0; m-- )
{
if( 0 == strcasecmp( name, szMonth[m] ) )
{
break;
}
}
return m;
}
それはあなたにとって醜すぎるか非効率的ですか?それは私にとってはうまくいき、失敗の簡単なZEROケースも便利です. 名前/インデックスのペアを持つデータ構造体を使用し、名前で並べ替え、バイナリ検索を使用して月を見つけてインデックスを返すことで、常に少し高速化できます...しかし、いくつかの比較を保存するための追加のコードの価値はありますか? ? はいの場合もあれば、いいえの場合もあります。
- 編集 -
気に入らない場合strcasecmp
は、次のように置き換えることができます。
if( (tolower(name[0]) == szMonth[m][0])
&& (tolower(name[1]) == szMonth[m][1])
&& (tolower(name[2]) == szMonth[m][2]) )
于 2013-03-21T18:31:39.627 に答える
0
月の名前の配列と照合するだけです。
static const char *months[] = {"JAN", "FEB", "MAR", ...};
int get_month_number(const char *month) {
int i;
for(i=0; i<12; i++)
if(!strcmp(months[i], month))
return i;
return -1;
}
月が無効な場合は-1(正規の障害コード)を返し、それ以外の場合は0-11を返します。
于 2013-03-21T18:39:55.830 に答える