Как мне преобразовать данные формы из выпадающего списка с несколькими выборками из массива в строку?

Но когда я вводил в него такие вещи, как abcd, цикл продолжался бы вечно и не останавливался для подсказки.

Это потому, что если scanf встречает символ, который не сопоставить спецификатор преобразования, он оставляет его во входном потоке. В основном, то, что происходит, заключается в том, что scanf считывает символ a из входного потока, определяет, что он не является допустимым совпадением для спецификатора преобразования %d, а затем отталкивает его обратно на входной поток. В следующий раз через цикл он делает то же самое. И опять. И опять. И опять.

fflush не является хорошим решением, поскольку он не определен для работы с входными потоками.

Для ввода "12ab", scanf будет читать и преобразовывать "12", оставив "ab" во входном потоке.

Лучшим решением является чтение всего вашего ввода в виде текста, затем преобразование в числовые типы с использованием strtol (для целых значений) и strtod (для реальных значений). Например:

char input[SIZE]; // assume SIZE is big enough for whatever input we get
int value;

if (fgets(input, sizeof input, stdin) != NULL)
{
  char *chk;
  int tmp = (int) strtol(input, &chk, 10);
  if (isspace(*chk) || *chk == 0)
    value = tmp;
  else
    printf("%s is not a valid integer string\n", input);
}

chk указывает на первый символ во входном потоке, который не является десятичной цифрой. Если этот символ не является пробелом или терминатором 0, то входная строка не является допустимым целым числом. Это обнаружит и отклонит входы, такие как "12ab", а также "abcd".

scanf является хорошим решением, если вы знаете, что ваш вход всегда будет правильно сформирован и хорошо выполнен. Если есть вероятность, что ваш вход не выполнен , используйте fgets и конвертируйте по мере необходимости.

0
задан Paresh Pandit 27 February 2019 в 09:50
поделиться