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



这是一个家庭作业问题。我用的是C.

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

我正试图使用开关根据输入的chars的值设置m。以下解决方案运行良好,除非输入的月份是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不起作用吗?

您没有将break;放在每个嵌套开关块之后。

考虑

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 %dn", ((foundAt - months) / 4) + 1);
    }
    else
    {
        /* Not a valid month */
    }
}
else
{
    /* Not a valid month */
}

提高输入的百分比,您应该能够通过搜索数组找到有效月份。如果你发现了什么,那么看3超过那个位置。如果它是一个逗号,那么您发现的内容是有效的。计算所找到的点与月初之间的差值。把它除以4,得到一个唯一的数字0。。N.加1,得到一个更好看的月数(jan=1,依此类推(。

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

在'j'和'n'的case块末尾缺少一个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;

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

const char* month = "JUN";

转换可以使用:

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

在此之后,monthNo将等于5(即编号为0-11的月份(,所以如果需要它是6,只需加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 "???";
}

@Elazar已经指出了您的错误所在。这只是另一种方法:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int monthn(const char *);
int main()
{
  printf("JAN:%d,jan:%dn",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

最新更新