2013-05-06 23 views
0

這是一項家庭作業問題。我正在使用C.使用開關將按字母順序排列的月份轉換爲整數

我以三個字母的字符串形式輸入月份(七月,一月,四月...),並且我需要將此輸入轉換爲整數值。

我想根據輸入的值char s使用開關設置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工作?

+4

只需使用STRCMP。 – Pubby 2013-05-06 22:23:52

+1

insert'break;' – BLUEPIXY 2013-05-06 22:25:56

+1

@Pubby OP應該真的使用'strncmp',但除此之外,是的 – Falmarri 2013-05-06 22:28:15

回答

5

你沒有把break;之後每個嵌套開關塊。

+1

這和'J'!='j'' – 2013-05-06 22:26:40

+1

+1特別是case'n''和case'j''沒有'break'語句。 – pmg 2013-05-06 22:27:01

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; 
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等等)。

這比開關方式更容易閱讀和使用。

+0

上面的代碼顯示了這個概念。人們還必須考慮find不是3個字符長或嵌入逗號或空字符串的情況。 – EvilTeach 2013-05-07 13:32:23

1

如果您不需要需要使用switch語句,快速簡單的解決方案如下。比方說,你有個價值要這樣轉換:

const char* month = "JUN"; 

轉換是可以做到用:

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

monthNo之後將等於5(即月被編號0-11),所以如果你需要六個,只需加1。

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 "???"; 
} 
+1

少量使用'short int'。 – Jack 2013-05-06 23:10:33

+0

它被提升爲平等測試。 – EvilTeach 2013-05-07 13:34:13

+0

@evilteach什麼是促進? – 2013-05-07 13:45:13

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