Как предотвратить сбои меню, когда scanf ожидает int, но получает символы (C) - PullRequest
1 голос
/ 11 марта 2011

Взять, к примеру:

printf("Continue?\n>>");
scanf("%d", &cont);
getchar();

Обычно я добавляю getchar (), чтобы предотвратить бесконечный цикл программы (считывание символа '\ n' из буфера). Однако при использовании с меню, следующим за этим оператором, считываются дополнительные символы, и любые scanfs после ввода символов (до количества введенных символов) пропускаются.

То, что я хочу выяснить, - это как предотвратить пропуск вперед через несколько разделов моей программы, когда она читает в виде ввода, отличном от int. Будет ли это лучше всего решить, поместив его в цикл, который не будет продолжаться до тех пор, пока переменная не окажется в ожидаемом домене?

Ответы [ 3 ]

1 голос
/ 11 марта 2011

Попробуйте вместо этого использовать fgets и sscanf. Загрузите значение ввода строки, затем проанализируйте только эту строку вместо всего стандартного ввода.

0 голосов
/ 11 марта 2011

Вместо чтения целого числа просто прочитайте строку и преобразуйте ее в число (atoi). Могут возникнуть две проблемы:

  1. Буфер символов недостаточно велик. Чтобы предотвратить это, вы можете прочитать символ за символом со входа и перераспределить буфер при необходимости.
  2. Строка не является числом. Atoi вернет некоторое значение по умолчанию (0 или -1, не помню). Вам просто нужно как-то проверить строку.
0 голосов
/ 11 марта 2011

Проверьте значение, возвращаемое scanf. Возвращаемое значение указывает количество переменных, которые были назначены. Если вы ожидаете int и пользователь вводит символ, scanf должен вернуть ноль.

Попробуйте включить "%*s" входной спецификатор. Смотри http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

...