Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我需要用C语言解析一些月份名称_C_Parsing - Fatal编程技术网

我需要用C语言解析一些月份名称

我需要用C语言解析一些月份名称,c,parsing,C,Parsing,用户输入生日:月、日、年。当然,它必须是字符串格式,因为整数不够好。无论如何,我需要找出一年中的哪一天是一个特定的生日(因此1994年5月31日将是151天)。但是,在执行此操作之前,我需要能够将字符串“MAY”转换为某个整数。如何轻松解析这些?我一直在尝试涉及strcmp()和switch语句或大量ifs的大混乱,但事情似乎不想起作用。是否有一种更简单的方法可以不更改程序的规格?这里有一种方法,使用1..12表示月份编号,0表示无效的月份名称: int GetMonth( char *name

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

这里有一种方法,使用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]) )

只需对照月份名称数组进行检查

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;
}
static const char*months[]={“一月”、“二月”、“三月”、…};
int get_month_number(常量字符*月份){
int i;

对于(i=0;iOne)来说,常见的策略是使用一个包含所有有效搜索词的字符串(此处为月份名称)连接,在其中搜索给定的键,并使用在switch语句中找到的字符串偏移量。我不确定哪一个更可怕:这会起作用,还是有人想到了这一点。谢谢!忽略_stricmp,我最大的问题是我真的不知道静态是如何工作的。
static
me表示数组只创建和初始化一次,并且在程序的整个生命周期内都存在。如果您想保护它,可以添加适当的
const
标签,但在这么小的函数中,我不介意(是的,我很懒。)现在字符串比较还不错,但是如果你想避免函数调用的话,你可以一个字符一个字符地将三个相等的比较组合在一起(我在回答中添加了一个例子).
\u stricmp
不在标准C中。顺便说一句。这很好,但我使用了我所知道的,并希望它足够清晰。我会将其更改为
stracecmp
,我认为它更标准。当然,这不仅仅是吹毛求疵。该功能在任何非Microsoft的系统上都不可用,而且最好在功能扩展时保持可移植性ist在标准库中。对于“jan”或“jan”,多个函数返回(某些位置未批准)和忽略大小写不匹配将失败等等。多个函数返回?严重吗?我发现一个五行长的函数没有问题。OP并不表示需要区分大小写。所有输入都是大写的完整月份名称。此外,在这种情况下,多个返回也可以,只要它能工作就可以。:)我从事的项目都有严格的编码标准,单点输入/返回并不是一个不寻常的规则。因为这个人显然只是在学习,所以指出这样的事情并没有什么坏处,是吗?这并没有坏处,但可能会让人困惑,因为这是一个相当不寻常的编码风格要求,至少对于像这