c - 使用switch语句和scanf()函数的C语言多选菜单程序

标签 c

我正在尝试使用 C 中的 switch 语句编写一个带有选择菜单的程序。这是我的代码:

main ()
{
    char option;
    int test;
    start:
    printf ("Enter: ");
    scanf ("%c", &option);
    while (getchar() != '\n');
    switch (option)
        {
            case '1': 
                printf ("Test 1 : ");
                scanf ("%d", &test);
                break;
            case '2':
                printf ("Test 2 : ");
                break;
        }
    if (option != 'q') goto start;
}

该程序旨在重复,直到从键盘输入“q”字符。问题是每当我第一次尝试从键盘输入“1”(执行案例 1)时,下次我输入“1”或“2”时,程序将跳过案例 1(或 2)并继续直接进入下一个循环,但是在下一个循环之后它正常执行案例 1(或 2)。此外,案例 2(没有 scanf () 函数)一切正常。我还尝试从案例 1 中删除 scanf,然后案例 1 正常执行。下面是一些输出:

Enter: 1
Test 1 : 5
Enter: 1
Enter: 1
Test 1 : 7
Enter: 2
Enter: 2
Test 2 :
Enter: 2
Test 2 :

任何人都可以向我解释我的代码有什么问题并告诉我如何修复它吗?

最佳答案

使用循环代替 goto -

while(option!='q'){
   printf ("Enter: ");
  if(scanf (" %c", &option)==1){       // leave a space before %c and check return of scanf
  //while (getchar() != '\n');
  switch (option)
    {
        case '1': 
            printf ("Test 1 : ");
            scanf ("%d", &test);
            break;
        case '2':
            printf ("Test 2 : ");
            break;
    }
  }
}

关于c - 使用switch语句和scanf()函数的C语言多选菜单程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33170752/

相关文章:

c - 错误: a parameter list without types is only allowed in a function definition

c - Glade、GtkBuiler 或 Gtk 意外地交换了信号处理程序

java - 将进程附加到调试 session : empty process list

c - 反转字符串 c 中的单词

c++ - 需要帮助理解遗留的 C 代码 _fmemcpy((LPSTR FAR *)Defdat,(LPSTR FAR *)&DLLdat,sizeof(DATSETTING));

c - 为什么我收到从 'double' 到 'float' 的转换,可能会丢失数据警告?(c)

c - 进程子创建新 session

curses.h 库中的 Clear() 函数

c - make 如何知道要更新哪些文件

C termios 和 printf 问题