使用开关将按字母顺序的月份转换为整数

时间:2013-05-06 22:22:12

标签: c

这是一个家庭作业问题。我正在使用C.

我以三个字母的字符串形式输入一个月(Jul,Jan,Apr ...),我需要将此输入转换为整数值。

我正在尝试使用开关根据输入的m的值设置char。以下解决方案工作正常,除非输入的月份为JUN,应转换为6,而是转换为2:

char mo[] = {month[0], month[1], month[2]};  //convert the string to a char array

int m;   //declare return value

switch(mo[0]){
case 'j':
    switch(mo[2]){
    case 'n':
        switch(mo[1]){
        case 'a':
            m = 1;
            break;
        case 'u':
            m=6;
            break;
        }
    case 'l':
        m=7;
        break;
    }
case 'f':
    m=2;
    break;

知道为什么这对JUN无效?

6 个答案:

答案 0 :(得分:5)

你没有在每个嵌套切换块之后放置break;

答案 1 :(得分:2)

考虑

const char *months = "JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC,";

const char *find = "MAY";

const char *foundAt = strstr(months, find);
if (foundAt != NULL)
{
    if (foundAt[3] == ',')
    {
        printf("This is month number %d\n", ((foundAt - months) / 4) + 1);
    }
    else
    {
        /* Not a valid month */
    }
}
else
{
    /* Not a valid month */
}

输入大写,您应该能够通过搜索数组找到有效的月份。 如果你找到了什么,那就看看那个位置的3点。如果是逗号,那么您找到的内容是有效的。 计算找到的点与月份的开始之间的差异。将它除以4得到一个唯一的数字0 .. N.加1,以获得更好看的月份数(jan = 1等等)。

这比切换方法更容易阅读和使用。

答案 2 :(得分:1)

在“j”和“n”的案例块末尾缺少break语句。

switch(mo[0]){
case 'j':
    switch(mo[2]){
    case 'n':
        switch(mo[1]){
        case 'a':
            m = 1;
            break;
        case 'u':
            m=6;
            break;
        }
        break;
    case 'l':
        m=7;
        break;
    }
    break;
case 'f':
    m=2;
    break;

答案 3 :(得分:1)

如果您不需要使用switch语句,快速简便的解决方案如下。假设您有要转换的月份值:

const char* month = "JUN";

转换可以使用:

完成
const char* MONTHS = "JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC";
int monthNo = ( strstr( MONTHS, month ) - MONTHS ) / 3;

在此monthNo等于5(即数字为0-11的月份)之后,如果您需要为6,则添加1。

答案 4 :(得分:1)

short int mesnum(char *mes){
    if((strcmp(mes,"Jan")==0))
        return 1;
    if((strcmp(mes,"Feb")==0))
        return 2;
    if((strcmp(mes,"Mar")==0))
        return 3;
    if((strcmp(mes,"Apr")==0))
        return 4;
    if((strcmp(mes,"May")==0))
        return 5;
    if((strcmp(mes,"Jun")==0))
        return 6;
    if((strcmp(mes,"Jul")==0))
        return 7;
    if((strcmp(mes,"Aug")==0))
        return 8;
    if((strcmp(mes,"Sep")==0))
        return 9;
    if((strcmp(mes,"Oct")==0))
        return 10;
    if((strcmp(mes,"Nov")==0))
        return 11;
    if((strcmp(mes,"Dec")==0))
        return 12;
    return 99;
}

char* nummes(short int num){
    if(num==1)
        return "Jan";
    if(num==2)
        return "Feb";
    if(num==3)
        return "Mar";
    if(num==4)
        return "Apr";
    if(num==5)
        return "May";
    if(num==6)
        return "Jun";
    if(num==7)
        return "Jul";
    if(num==8)
        return "Aug";
    if(num==9)
        return "Sep";
    if(num==10)
        return "Oct";
    if(num==11)
        return "Nov";
    if(num==12)
        return "Dec";
    return "???";
}

答案 5 :(得分:0)

@Elazar已经指出了你的错误。这只是另一种方式:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int monthn(const char *);

int main()
{
  printf("JAN:%d,jan:%d\n",monthn("JAN"),monthn("jan"));
  return 0;
}

int monthn(const char *name)
{
  const char *months[] = { "JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC" };
  int i = 0;
  for(i = 0; i < sizeof(months)/sizeof(months[0]); i++) 
    {
      if(strcmp(months[i], name) == 0) 
      return i;
  }
  return -1;
}

此输出:

JAN:0,jan:-1