在C语言中接受单个字符的菜单

时间:2010-11-28 02:49:35

标签: c menu

我想在C程序中创建一个接受单个字符的简单菜单。菜单将如下:

  1. [S]如何
  2. [E] XIT
  3. 如果用户输入'1','s'或'S',程序将打印“Hello”并再次提示输入 否则,如果用户输入“2”,E或“E”,则程序结束。 否则它应该打印“无效输入”并再次提示。

    我能够创建程序,但问题是当用户输入12,13,14,15,16 .....所以从1开始,它显示Hello和其他选项相同。

    我的代码是:

    #include <stdio.h>
    
    void clearBuffer();
    
    
    int main() {
    
        int i = 0;
        char selection;
    
        do
        {
            printf("\t1. [S]how\n");
            printf("\t2. [E]xit\n");
            printf("Enter your selection from the number or character noted above: ");
            scanf("%s", &selection);
            clearBuffer();
    
            if (selection == '1' || selection == 's' || selection == 'S')
                printf("Hello");
            else if (selection == '2' || selection == 'E' || selection == 'x')
                i = 0;
    
     } while(i != 0);
    
    
    
    }
    
    void clearBuffer()
    {   
    
        while(getchar() != '\n');
    
    }
    

3 个答案:

答案 0 :(得分:3)

如果您只想接收一个字符,请考虑替换 getchar()函数的scanf()函数:

printf("Enter your selection from the number or character noted above: "); 
selection = getchar();

答案 1 :(得分:2)

您可以使用strlen(它是标准C库的一部分)来检查scanf返回的字符串的长度,并拒绝超过一个字符的条目:

if (strlen(selection) > 1)
{
    printf("Invalid selection.");
}

或者,我认为你可以使用getchar()只接受用户的一个字符,这意味着他们不必按Enter键。

答案 2 :(得分:1)

如前所述,如果您只想要一个字符,则应使用getchar()。如果您因任何原因仍想使用scanf(),则格式正确为"%c",而不是"%s"

我还建议,如果你正在寻找一个单个字符,if块看起来有点“忙”(读,笨拙)......一个开关将是一个更干净,更优雅的方式它(恕我直言)。

/* something like this ... */
switch ( selection ) {
  case '1':
  case 's':
  case 'S':
    printf ( "Hello\n" );
    break;

  case '2':
  case 'e':
  case 'E':
    i = 0;
    break;
}

其他几件事......如果您不关心正在阅读的角色的情况(即's''S'会做同样的事情),您可以转换{在selection - 阻止或if之前使用switch阻止{1}}大写。此外,这只是一个样式建议,不要使用toupper()作为退出标志。一般做法是使用ii之类的东西作为计数器或索引 - 您可以使用类似jquit_now的内容,这样可以更准确地传达变量的含义。< / p>