这是一个家庭作业问题。我用的是C.
我以三个字母字符串的形式输入一个月(Jul,Jan,Apr…(,我需要将此输入转换为整数值。
我正试图使用开关根据输入的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
不起作用吗?
您没有将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