0

ユーザーは誕生日を入力します:月、日、年。もちろん、整数では不十分なので、文字列形式である必要があります。とにかく、特定の誕生日が1年のどの日であるかを見つける必要があります(したがって、1994年5月31日は151日目になります)。ただし、これを行う前に、文字列「MAY」を整数に変換できる必要があります。これらを簡単に解析するにはどうすればよいですか?私はstrcmp()とswitchステートメントまたはifの巨大なブロックを含む巨大な混乱を試みてきましたが、物事はうまくいきたくないようです。プログラムの仕様を変更せずに簡単な方法はありますか?

4

2 に答える 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 に答える