Как определить, вводит ли пользователь букву внутри меню

#c #c99

#c #с99 #c99

Вопрос:

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

Я пытался использовать функцию strcmp (x, y), однако, похоже, у меня это не работает.

 int main(void) {
    int run = 1;
    int choice;
    do
    {
        printf("options: n1. foo n2.Bar n");
        scanf("%d", amp;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;
}
  

Комментарии:

1. После того, как вы напечатаете вопрос, вы должны получить входные данные. Использовать scanf("%d", amp;choice)

Ответ №1:

Как сказано в замечании, вы никогда не устанавливаете выбор, поэтому его значение не определено, а его использование — неопределенное поведение

например, заменить

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

Автор:

     printf("options: n1. foo n2.Bar n");
    if (scanf("%d", amp;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", amp;choice) != 1) {
      fprintf(stderr, "EOF");
      return -1;
    }
    ...
    case '1':
    ...
    case '2':
    ...
  

обратите внимание на пробел перед %c , чтобы обойти пробелы и новые строки, в этом случае, конечно, замените case 1 на case '1' и case 2 на case '2'

Всегда проверяйте результат scanf если вы просто делаете scanf("%d", amp;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", amp;choice) != 1) {
      fprintf(stderr, "EOF");
      return -1;
    }

    switch (choice) {
    case '1': 
      printf("hello foon");
      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 %cn", 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. Добавлена функция сканирования

Ответ №2:

Вы должны добавить оператор scanf после печати «Параметры: …»

 #include <stdio.h>

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

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


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


    }while (run == 1);

    return 0;
}
  

Если вам нужно проверить, является ли введенное значение цифрой, вы можете использовать isdigit() функцию.

Комментарии:

1. вы путаете 1 и 2 с ‘1’ и ‘2’, и если вы хотите ввести цифру, лучше сделать scanf(" %c", amp;choice) , а не scanf с %d

2. да, но вопрос касается целых чисел, поэтому я ответил %d

3. Пожалуйста, никогда не предлагайте решение для получения целого числа с помощью scanf без проверки возвращаемого значения, просто запустите свою программу и введите что-то еще, кроме числа…