即使大小写不匹配,菜单也会打印两次并默认运行

Menu prints twice and default runs even when case doesn't match

我正在尝试向用户显示一个菜单并允许他们从选项中进行选择。它处于 while 循环中,因为它必须迭代直到选择选项“e”以退出程序。如果用户输入不被接受的值,我将“默认”选项作为故障保护。无论我做什么,默认情况下总是 运行s 并且菜单总是在代码的初始 运行 之后出现两次。 我已经尝试将“getchar()”更改为 scanf,但它仍然会产生相同的重复输出。我也尝试完全取消开关,但使用 if/then 语句得到相同的结果。我附上了我的完整代码,非常感谢您的帮助!!

#include <stdio.h>
#include <stdlib.h>
    // function for the menu
   char menu() {
printf("Please select from the following menu: \n");
// setting up the menu from here
printf("a. input the data files location \n");
printf("b. enter the time interval \n");
printf("c. process and display the US Life Expectancy Data \n");
printf("d. process and display the Statistics of All Data \n");
printf("e. exit the program \n");
    }

    char options(char choice) {
switch (choice) {
case 'a':
    printf("choice a\n");
    break;
case 'b':
    printf("choice b\n");
    break;
case 'c':
    printf("choice c\n");
    break;
case 'd':
    printf("choice d\n");
    break;
case 'e':
    break;
default: // default when none of the cases are matched
    printf("Invalid input\n");
    break;
}
    }

    // main function
    int main(void) {
char choice;
do {
    menu();
    while ((choice = getchar()) == "\n") {};
    if (choice == EOF) {
        exit(1);
    }
    options(choice);
} while (choice != 'e');
    }

问题是您的代码不处理换行符。换句话说,当您键入 a 后跟 ENTER 时,您的代码实际上会收到两个字符。 'a''\n'。因此菜单将被打印两次并且你得到一个“无效输入”。

快速修复可能是:

choice = getchar(); --> while ((choice = getchar()) == '\n') {};

就是说,您应该将 choice 更改为 int 并执行以下操作:

int choice;

....
....

    while ((choice = getchar()) == '\n') {};
    if (choice == EOF)
    {
        // Fatal input error
        exit(1);
    }

最后,将 choice 作为全局变量是个坏主意。而是将其放入 main 并将其作为参数传递给函数 options。但不要将它传递给 menu。也一样:

char options() { --> char options(int choice) {

int main(void) {
    int choice;
    do {
        menu();
        while ((choice = getchar()) == '\n') {};  // ignore newlines
        if (choice == EOF)
        {
            // Fatal input error
            exit(1);
        }
        options(choice);
    } while (choice != 'e');
}