当前位置: 首页 > 知识库问答 >
问题:

C语言中使用开关语句和scanf()函数的多选菜单程序

穆智刚
2023-03-14

我试图写一个程序与选择菜单使用开关语句在C.这是我的代码:

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 :

谁能给我解释一下我的代码出了什么问题,并告诉我如何修复它?

共有3个答案

微生信鸿
2023-03-14

浏览你的代码:

scanf ("%c", &option);

输入1\n\n是按Enter生成的换行符)。上面的scanf消耗1,将\n留在标准输入流(stdin)中。接下来,

while (getchar() != '\n');

使用\n并中断循环(因为条件为false)。现在,

scanf ("%d", &test);

您可以键入

scanf ("%c", &option);

scanf会在stdin中看到上次调用scanf时留下的\n,并使用它,因此不会等待进一步的输入。这就是问题所在。

修复方法包括更改

>

  • 这个:

      scanf ("%d", &test);
    

      scanf ("%d%*c", &test); /* `%*c` scans and discards a character */
    

      scanf ("%c", &option);
    

      scanf (" %c", &option); /* The space discards all whitespace characters, if any, until the first non-whitespace character */
    

  • 荀增
    2023-03-14

    scanf(“%d”,

    公良俊楚
    2023-03-14

    使用循环,而不是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;
        }
      }
    }
    
     类似资料:
    • 在 Go 语言开篇中我们已经知道,Go 语言与 C 语言之间有着千丝万缕的关系,甚至被称之为 21 世纪的C语言。 所以在 Go 与 C 语言互操作方面,Go 更是提供了强大的支持。尤其是在 Go 中使用 C,你甚至可以直接在 Go 源文件中编写 C 代码,这是其他语言所无法望其项背的。 格式: 在 import "C" 之前通过单行注释或者通过多行注释编写C语言代码 在 import "C" 之

    • 本文向大家介绍C语言中scanf()和gets()之间的区别,包括了C语言中scanf()和gets()之间的区别的使用技巧和注意事项,需要的朋友参考一下 在C语言中,都定义了和函数,以从外部源获取输入并将其作为输入传递给系统。现在,两个功能之间存在一些特性差异。 以下是和之间的重要区别- 序号 键 scanf()函数 gets()函数 1 定义 该方法可以从键盘读取输入,并根据给定的格式说明符将

    • 本文向大家介绍C语言中scanf函数与空格回车的用法说明,包括了C语言中scanf函数与空格回车的用法说明的使用技巧和注意事项,需要的朋友参考一下 众所周知,C语言中的scanf函数的作用是从标准输入设备(通常是键盘)读取输入值,并存储到参数列表中指针所指向的内存单元。 下面从几个方面说一下一些稍微细节的东西。下面的实验都在vc6.0中通过。 1、scanf的返回值 scanf通常返回的是成功赋值

    • 在 Go 代码中通过 //export Go函数名称 导出Go的函数名称 在 C 代码中通过 extern 返回值类型 Go函数名称(形参列表); 声明 Go 中导出的函数名称 注意://export Go 函数名称 和 extern 返回值类型 Go函数名称(形参列表); 不能在同一个文件中 package main import "C" import "fmt" // 导出Go函数声

    • 我试图理解scanf和输入缓冲区之间的关系。我将scanf与以下格式字符串一起使用: 并尝试理解为什么我可以输入尽可能多的空白(输入,空白,选项卡)后,我输入一个数字,如54,并按回车键。 据我所知,我按下的每一个键都会被放入输入缓冲区,直到我按下回车键。 因此,如果我输入54并按Enter键,输入缓冲区包含3个元素,两个数字和换行符。所以我的缓冲区看起来像[5][4][\n] 现在从左到右计算s

    • 这节课我们来学习下程序中另外一个非常重要的语句:if。 1. 语法 if (判断条件布尔运算) { 条件成立后运行的语句 } 这里的条件判断采用了布尔运算,也就是真值和假值两种情况。当 if 后面放入的条件判断语句的执行最终结果为真的时候,就会执行花括号中的语句,如果条件语句最终的结果为假,那么就不会执行花括号 中的语句,程序会跳过花括号中的代码段,继续执行后面的代码。 这里给出了真值表,以供