这是一个家庭作业问题。我正在使用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
无效?
答案 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