如何检测用户是否在菜单内输入字母

时间:2019-04-21 13:30:01

标签: c c99

我正在为游戏制作菜单,当我测试该程序并输入字符或字符串时,该程序将运行默认值,直到永远出现。

我尝试使用strcmp(x,y)函数,但是似乎不适用于我。

int main(void) {
    int run = 1;
    int choice;
    do
    {
        printf("options: \n1. foo \n2.Bar \n");
        scanf("%d", &choice")
        switch (choice) {
        case 1: printf("hello world \n");
            break;
        case 2: printf("Hello World \n");
            break;
        default: printf("enter a valid option");
            break;
        }
        } while (run == 1);
return 0;
}

2 个答案:

答案 0 :(得分:1)

如前所述,您永远不会设置 choice ,因此其值是不确定的,其用法是未定义的行为

例如替换

        printf("options: \n1. foo \n2.Bar \n");

作者

    printf("options: \n1. foo \n2.Bar \n");
    if (scanf("%d", &choice) != 1) {
      /* not an integer, byppass all up to the newline */
      int c;

      while ((c = getchar()) != '\n') {
        if (c == EOF) {
          fprintf(stderr, "EOF");
          return -1;
        }
      }
      choice = -1;
    }

或更简单地获取字符而不是 int

    char choice;
    ...
    printf("options: \n1. foo \n2.Bar \n");
    if (scanf(" %c", &choice) != 1) {
      fprintf(stderr, "EOF");
      return -1;
    }
    ...
    case '1':
    ...
    case '2':
    ...

请注意%c之前的空格以绕过空格和换行符,在这种情况下,当然将case 1替换为case '1',将case 2替换为case '2'

始终检查 scanf 的结果,如果您只是执行scanf("%d", &choice);而用户未输入数字,则您的程序将循环播放而不会结束询问选择并指出错误,因为没有绕过非数字 not ,所以将不再获得输入,因此 scanf 会一直得到它。

也请注意

  • 选项1和2都执行printf("hello world \n")
  • run 从未修改过,所以do ... while (run == 1);无法结束,也许您想针对以下情况将 run 设置为0(我的意思是值== 1) 1和2?

示例:

#include <stdio.h>

int main(void) {
  int run;
  char choice;

  do
  {
    run = 0;
    puts("options:\n 1. foo \n 2. Bar");
    if (scanf(" %c", &choice) != 1) {
      fprintf(stderr, "EOF");
      return -1;
    }

    switch (choice) {
    case '1': 
      printf("hello foo\n");
      break;
    case 2:
      printf("Hello bar \n");
      break;
    default:
      run = 1;
      puts("enter a valid option");
      break;
    }
  } while (run == 1);

  printf("all done with choice %c\n", choice);
  return 0;
}

编译和执行:

pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra c.c
pi@raspberrypi:/tmp $ ./a.out
options:
 1. foo 
 2. Bar
a
enter a valid option
options:
 1. foo 
 2. Bar
33
enter a valid option
options:
 1. foo 
 2. Bar
enter a valid option
options:
 1. foo 
 2. Bar
1
hello foo
all done with choice 1
pi@raspberrypi:/tmp $ 

答案 1 :(得分:0)

打印“ Options:...”后必须添加scanf语句

#include <stdio.h>

int main(void) {
    int run = 1;
    int choice;

    do{
        printf("options: \n1. foo \n2.Bar \n");
        scanf("%d", &choice);


        switch (choice) {
            case 1: 
                printf("hello world \n");
                break;
            case 2: 
                printf("Hello World \n");
                break;
            default: 
                printf("enter a valid option\n");
                break;
        }


    }while (run == 1);

    return 0;
}

如果需要检查输入的值是否是数字,可以使用isdigit()函数。