如何使用带有c的字符串输入的switch?
我是C语言的新手,我想做一个程序,用开关把月份转换成月份数 例如: 输入:如何使用带有c的字符串输入的switch?,c,string,random,switch-statement,C,String,Random,Switch Statement,我是C语言的新手,我想做一个程序,用开关把月份转换成月份数 例如: 输入: "january" 输出: "1" 以下是我的工作: void function(char number[]); int main() { char xm[20]; printf("Month:"); scanf("%s", &xm); function(xm); return 0; } void function (char number[20]) {
"january"
输出:
"1"
以下是我的工作:
void function(char number[]);
int main()
{
char xm[20];
printf("Month:");
scanf("%s", &xm);
function(xm);
return 0;
}
void function (char number[20])
{
switch (number[20])
{
case 'january': printf("1");
break;
case 'february': printf("2");
break;
case 'march': printf("3");
break;
default:
printf("error");
}
}
在c中不能这样做,
switch
将只处理整数,传递指向它的指针可能会编译,但不会执行需要的操作
就你而言,我想你的意思是
switch (number)
这可能会编译,1也会让你的代码编译,但是它们会被计算成一个整数,这个整数是实现定义的,所以你的代码会意外编译,但肯定不会像你期望的那样工作
最好是定义一个结构并像这样使用bsearch()
#包括
#包括
#包括
结构mi{
国际天然气公司;
字符*名称;
}月[]={
{1,“一月”},{2,“二月”},{3,“三月”},{4,“四月”},
{5,“五月”}、{6,“六月”}、{7,“七月”}、{8,“八月”},
{9,“九月”}、{10,“十月”}、{11,“十一月”}、{12,“十二月”}
};
#定义月数(sizeof(月)/sizeof(月[0]))
静态整数
compmi(常数空隙*m1,常数空隙*m2)
{
结构mi*mi1=(结构mi*)m1;
结构mi*mi2=(结构mi*)m2;
返回strcmp(mi1->name,mi2->name);
}
int
主(内部argc,字符**argv)
{
int i;
qsort(月数、月数、大小(结构mi)、compmi);
对于(i=1;iname,res->nr);
}
退出(退出成功);
}
1此链接复制自的评论
2此示例来自linux手册中的“您不能”。至少,不是用C 改用
if((strcmp(number,"january")==0)
printf("1");
else if((strcmp(number,"february")==0)
printf("2");
//etc
请注意,您需要包括string.h
才能使用strcmp
另一种方法是将所有月份的名称存储在二维
char
数组中。使用strcmp
循环此数组并将输入与每个月的名称进行比较。如果找到匹配项,则打印month数组+1的当前索引。即使可能:开关(数字[20])肯定是错误的。只想指出,“一月”
不是字符串。字符串必须使用双引号。这里有一个。如果我没记错的话,我想你可以直接将strcmp()传递给bsearch(),而不需要包装函数。@Lundin当然可以,但是你在本例中使用的数组不是字符串,而是struct
s。不使用struct的一个很好的理由,但要将数字保留在单独的查找表中。在这种情况下,数字只是从bsearch()+1返回的索引,因此实际上不需要将其存储在结构中。@Lundin值将被排序,否则bsearch()
将无法工作。因此,索引将不对应于月数。但是,如果字符串的数量很大,线性迭代将非常无效。strcmp“梯子”也是如此。对于大量数据,如果字符串是按排序顺序存储的,则需要使用二进制搜索。
if((strcmp(number,"january")==0)
printf("1");
else if((strcmp(number,"february")==0)
printf("2");
//etc