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

时间:2015-03-06 15:15:31

标签: c string random switch-statement

我在C中进行了新的编程,我想做一个程序,使用switch将月份转换为月份编号。

例如:

输入:

"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");
    }
}

2 个答案:

答案 0 :(得分:0)

你不能在c中做到这一点,switch只能使用整数,传递一个指向它的指针可能会编译但不会做你需要的。

在你的情况下,我想你的意思是

switch (number)

并且可以编译,multicharacter literals 1 也会使你的代码编译,但是它们将被计算为一个实现定义的整数,所以你的代码会意外编译但肯定会编译不像你期望的那样工作。

你能做的最好的事情就是定义一个结构并使用bsearch()这样的 2

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct mi {
   int nr;
   char *name;
} months[] = {
   { 1, "jan" }, { 2, "feb" }, { 3, "mar" }, { 4, "apr" },
   { 5, "may" }, { 6, "jun" }, { 7, "jul" }, { 8, "aug" },
   { 9, "sep" }, {10, "oct" }, {11, "nov" }, {12, "dec" }
};

#define nr_of_months (sizeof(months)/sizeof(months[0]))

static int
compmi(const void *m1, const void *m2)
{
   struct mi *mi1 = (struct mi *) m1;
   struct mi *mi2 = (struct mi *) m2;
   return strcmp(mi1->name, mi2->name);
}

int
main(int argc, char **argv)
{
   int i;

   qsort(months, nr_of_months, sizeof(struct mi), compmi);
   for (i = 1; i < argc; i++) {
       struct mi key, *res;
       key.name = argv[i];
       res = bsearch(&key, months, nr_of_months,
                     sizeof(struct mi), compmi);
       if (res == NULL)
           printf("'%s': unknown month\n", argv[i]);
       else
           printf("%s: month #%d\n", res->name, res->nr);
   }
   exit(EXIT_SUCCESS);
}

1 此链接已从Fred Larson的评论中复制。

2 这个例子来自bseach()

的linux手册

答案 1 :(得分:0)

你做不到。至少,不是在C。

改为使用

if((strcmp(number,"january")==0)
    printf("1");
else if((strcmp(number,"february")==0)
    printf("2");
//etc

请注意,您需要添加string.h才能使用strcmp

另一种方法是将所有月份的名称存储在二维char数组中。循环遍历此数组,并使用strcmp将输入与每个月的名称进行比较。如果找到匹配项,则打印月份数组的当前索引+ 1。