Как определить, вводит ли пользователь букву в меню - PullRequest
0 голосов
/ 21 апреля 2019

Я создаю меню для игры, и когда я тестирую программу и ввожу символ или строку, программа запускает значение по умолчанию для того, что кажется навсегда,

Я пыталсяиспользуйте функцию 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 ]

1 голос
/ 21 апреля 2019

Как сказано в замечании, вы никогда не устанавливаете 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); и пользователь не введет число, которое ваша программа зациклит, не заканчивая запросом выбора и указанием ошибки больше никаких входных данных получено не будет, поскольку номер не равен , а не , поэтому 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 $ 
0 голосов
/ 21 апреля 2019

Вы должны добавить оператор 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().

...