0

我只是有一个关于开关盒的快速问题。我可以这样做吗?我无法让它工作。当我输入退出时,程序只是说无效 3 次。原谅伪代码。哎呀,我忘了提到 printf 函数在那部分之前看起来像这样。

char choice;
printf("list, add, delete, write, quit\n");

do
{
scanf("%c", &choice);
//if (&choice== "quit"){exit(1);}

switch(choice)
    {
        case "list":
        case "add":
        case "delete":
        case "write":
        default:
            printf("Invalid\n");
            break;
        case "quit":
        exit (1);

    }while(&choice !="quit");

}

4

4 回答 4

4

你不能像那样比较字符串。字符串比较应该用strcmp和它的亲属来完成。在这种情况下,您正在比较字符串的地址。

于 2012-06-03T18:26:37.240 回答
2

尽管您不能按照您想要的方式直接比较字符串,但有一种方法可以使用字典和定义/枚举来进行切换(看看我在那里做了什么):

enum choices { LIST, ADD, DELETE, WRITE, QUIT, INVALID };

int
getchoice(char *input)
{
    static struct choices {
        enum choices val;
        const char *string;
    } choices [] = {
        { LIST, "list" },
        { ADD, "add" },
        { DELETE, "delete" },
        { WRITE, "write" },
        { QUIT, "quit" },
        { -1, NULL }
    };
    int i;

    for (i = 0; choices[i].val != -1; i++)
        if (strcmp(input, choices[i].string) == 0)
            break;
    if (choices[i].val == -1)
        return INVALID;
    return (choices[i].val);
}

然后为您的 switch 语句:

switch (getchoice(choice)) {
case LIST:
case ADD:
case WRITE:
case DELETE:
case INVALID:
default:
    printf("Invalid\n");
    break;
case QUIT:
    exit(1);
}

警告购买者,因为这还没有通过编译器运行,但总体思路应该足够清楚以适应您的具体情况。

于 2012-06-03T19:56:04.180 回答
1

此外,由于您不使用break其他default情况,因此您将自动“删除”到默认情况(即使您的输入choice匹配“列表”、“添加”、“删除”和“写入”)

于 2012-06-03T18:29:10.860 回答
0

要回答您的问题:

是的,您可以exit()在任何地方调用,包括在 switch-case 语句中。

但是该代码有很多问题,请参阅我对问题本身的评论。

于 2012-06-03T19:13:40.200 回答