Я должен решить упражнение, которое на первый взгляд показалось мне очень простым. Однако я не уверен, как его решить. Учитывая тот факт, что переменные 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?
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 бит точности для нормальных чисел, все хорошо. Следует соблюдать осторожность при тестировании диапазона значений с плавающей запятой.
scanf
вами ввода, проверив возвращаемое значение изscanf
.scanf
довольно полная. (Если вы этого не сделаете, вы сможете найти его с помощью быстрого поиска в Google.) Вам также необходимо понять разделение труда междуscanf
и кодом, которое вам нужно будет написать после вызоваscanf
для проверки ваших входных данных.