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