0

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

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

我正在尝试使用开关来m根据输入char的 s 的值进行设置。以下解决方案工作正常,除非输入的月份是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吗?

4

6 回答 6

5

您没有break; 每个嵌套的 switch 块之后放置。

于 2013-05-06T22:26:01.330 回答
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 等等)。

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

于 2013-05-06T22:30:54.740 回答
1

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

const char* month = "JUN";

可以使用以下方法完成转换:

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

在这之后monthNo将等于 5(即月份编号为 0-11),因此如果您需要它为 6,只需添加 1。

于 2013-05-06T22:48:16.293 回答
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 "???";
}
于 2013-05-06T22:50:13.220 回答
1

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

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;
于 2013-05-06T22:27:11.687 回答
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
于 2013-05-06T23:19:57.990 回答