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

Switch statement doesn't work in my C program?

如标题所示,我的 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 语句以使其发挥作用?

你在某种循环中调用它;您应该知道,一旦键入命令并且用户点击 return,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);.

注意前面的space if " %c";这指示 scanf 忽略白色 space 字符,即读取 stdin 直到遇到非白色 space 字符,然后读取它并将其放入 choice .