Scanf-чтение переменных, которые должны соответствовать спецификациям кератина

0

Я должен решить упражнение, которое на первый взгляд показалось мне очень простым. Однако я не уверен, как его решить. Учитывая тот факт, что переменные a и b имеют определенные допустимые значения, следует ли проверять, находятся ли они в правильном диапазоне после их чтения? А что касается переменной b, то в примерах она дается в научной нотации, поэтому я должен ее прочитать с помощью спецификатора e? И последнее, но не менее важное: присваивание присваивания ', " выполняется с помощью "%*[,]"?

Напишите набор инструкций для чтения со стандартного ввода трех переменных a, b и c, где переменные имеют следующие типы:

a - короткое целое без знака, b - float, c - строка длиной не более 31 символа

Входные значения разделяются одной запятой. Первая переменная задается как восьмеричное число. Допустимые значения для a и b следующие:

-4331 < a <= 28731
-1035 < b < 9749273 

Подходящие сообщения об ошибках следует указывать, если значения не находятся в допустимом диапазоне или в неправильном формате. Пример ввода:

12745, -1.e-3, Is this a good one? 

0xEE04F, 21e75, Maybe this one... 

70073, 21e+6, Or this one. Could this string be too long to put into allocated area?
  • 2
    Там действительно нет способа проверить значения, если вы на самом деле не читаете их. Вы можете проверить правильность типа scanf вами ввода, проверив возвращаемое значение из scanf .
  • 0
    Если у вас есть доступ к Linux-блокам, страница справочника по scanf довольно полная. (Если вы этого не сделаете, вы сможете найти его с помощью быстрого поиска в Google.) Вам также необходимо понять разделение труда между scanf и кодом, которое вам нужно будет написать после вызова scanf для проверки ваших входных данных.
Теги:
variable-assignment
scanf

1 ответ

1
Лучший ответ

OP: следует ли проверить, находятся ли они в правильном диапазоне после их чтения?
A: Да. Сканирование проверит ошибку грубого диапазона. Затем код проверяет локальный диапазон.

OP: прочитайте его с помощью спецификатора e?
A: a, e, f, g эквивалентны в scanf(). Поэтому используйте то, что кажется уместным: e это хорошо.

OP: подавление присваивания ',' выполняется с помощью "%*[,]"
A: Почти: можно использовать " %*1[,]", но "," достаточно.

Используйте fgets() и sscanf() а затем проверьте диапазон.

char buf[1000];
if (fgets(buf, sizeof buf, stdin) == NULL) {
  handle_EOF_or_IOError();
}
short Number;
float x;
char s[31+1];
if (3 != sscanf(buf, "%ho,%e, %31[^\n]", &Number, &x, s)) {
  handle_ParseError();
}
short NumberTooSmall = -4331;
short NumberMax = 28731
float xTooSmall = -1035.0f;
float xTooBig = 9749273.0f;
if ((Number <= NumberTooSmall) || (Number > NumberMax) ||
    (x <= xTooSmall) || (x >= xTooBig)) {
  handle_RangeError();
}

Примечание: есть тонкий вопрос о том, когда анализируется строка начнется в "12745, -1.e-3, Это хороший один?", И т.д. ОП говорит, что , является Seperator. Это означает, что строка начинается с " Is this...". Я думаю, что OP хочет пропустить ведущие пробелы и получить "Is this...".

Предполагая, что IEEE binary32 для float, 9749273.0 должен точно представлять 24 бита. Поскольку этот формат имеет 23 + 1 бит точности для нормальных чисел, все хорошо. Следует соблюдать осторожность при тестировании диапазона значений с плавающей запятой.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню