По сути, функция scanf
сопоставляет регулярные выражения на основе переданного вами спецификатора преобразования.Если вы укажете %d
, это скажет scanf
сопоставить ввод с регулярным выражением, состоящим из одного или нескольких символов от '0'
до '9'
(необязательно с начальным символом +
или -
).Затем он преобразует эту последовательность символов в эквивалентное целочисленное значение.
A очень упрощенная версия может выглядеть примерно так:
while (isdigit(c = fgetc(stream))
val = val * 10 + valueOf(c);
ungetc(c, stream);
где isdigit
- стандартная библиотечная функция, которая возвращает true (не ноль), еслисимвольное значение представляет десятичную цифру, а valueOf
- это определяемая пользователем функция, которая отображает символ, представляющий целое число ('0'
- '9'
), в эквивалентное целочисленное значение (0
- 9
) (I 'я не знаю стандартной библиотечной функции, которая делает это для отдельных значений символов).Почему бы просто не вычесть '0'
из c
, чтобы получить эквивалентное целочисленное значение?В зависимости от кодировки не гарантируется, что все десятичные целочисленные символы будут расположены по порядку («Весь мир не является ASCII»);лучше всего делегировать фактическое преобразование функции, которая знает о текущей кодировке.