0

用户输入生日:月、日、年。当然,它需要是字符串格式,因为整数不够好。无论如何,我需要找出特定生日是一年中的哪一天(所以 1994 年 5 月 31 日是第 151 天)。但是,在执行此操作之前,我需要能够将字符串“MAY”转换为某个整数。我如何轻松解析这些?我一直在尝试涉及 strcmp() 和 switch 语句或大量 ifs 的巨大混乱,但事情似乎并不想工作。有没有更简单的方法而不改变程序的规格?

4

2 回答 2

1

这是一种方法,使用 1..12 作为月份编号,使用 0 作为无效月份名称:

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;
}

这对您来说太丑陋或效率低下吗?它对我有用,而且简单的零失败案例也很方便。您总是可以通过使用带有名称/索引对的数据结构来加快速度,按名称排序并使用二进制搜索来查找月份并返回索引......但是是否值得额外的代码来保存一些比较? 有时是,有时不是。

- 编辑 -

如果您不喜欢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 回答