Switch语句在我的C程序中不起作用?

时间:2015-11-15 16:39:54

标签: c switch-statement

As in title我的switch语句有问题。问题是在用户输入字符后它没有进入案例,它只显示默认情况。这是我的代码:(函数名称是ask_for_command(int * p,int num_mov))

char choice = ' ';
printf("\nNEW MOVEMENT : Enter a valid command by keyword :\nValid commands : a d w x");
choice = getchar();
printf("\n");
switch (choice)
{
    case 'a':
        p--;
        num_mov++;
        break;

    case 'd':
        p++;
        num_mov ++;
        break;

    default:
        printf("Wrong Command, a d w x only.\n");
        break;

}

这里是我调用函数的地方:

while (!is_pal(a))
{
    if (!is_pal(a))
    {
        print_status(a, p, num_mov);
        printf("\n");
        ask_for_command(p, num_mov);
    }

那么如何修复我的switch语句以便它完成它的工作呢?

1 个答案:

答案 0 :(得分:1)

你在某种循环中调用它;你应该知道,一旦输入一个命令,用户点击返回,stdin中就会有两个字符:键入的字符和换行字符。因此,下次调用时,getchar()会读取换行符,因为它不匹配任何switch个案例,所以会转到default

另请注意,正如chqrlie在下面的评论中指出的那样,您将按值传递整数参数到您的函数中,在其中它们是新的,局部变量并且更改它们将无法执行您想要的操作

你可以解决所有这些问题:

printf("\nNEW MOVEMENT : Enter a valid command by keyword :\nValid commands : a d w x");
char choice;
if (scanf(" %c", &choice) == EOF)
{
    // act accordingly
}
printf("\n");
switch (choice)
{
    case 'a':
        *p--;
        *num_mov++;
        break;

    case 'd':
        *p++;
        *num_mov ++;
        break;

    default:
        printf("Wrong Command, a d w x only.\n");
        break;

}

并将参数作为指针传递:ask_for_command(&p, &num_mov);

如果" %c",请注意前面的空格;这指示scanf忽略空白字符,即读取stdin直到遇到非空白字符,然后读取并将其放入choice