如何使用带有c的字符串输入的switch?

如何使用带有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]) {

我是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])
{
    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