Опубликован: 15.11.2010 | Доступ: свободный | Студентов: 643 / 18 | Оценка: 4.00 / 5.00 | Длительность: 17:30:00
Специальности: Программист
Лекция 6:

Буферизированный (потоковый) ввод-вывод

6.5. Приложение №2. Описание опций формата функций scanf и printf

СПЕЦИФИКАЦИЯ ФОРМАТА ФУНКЦИИ PRINTF

СИНТАКСИС: %[flags][width][.precision][F|N|h|l|L]type, где

  • flags - определяет выравнивание выводимых символов, управление печатью знаковых символов ('+' и '-'), пробелов, десятичных точек, восьмеричных и шестнадцатеричных префиксов. Значения полей см. в таблице 6.3;
  • width - положительное целое десятичное число, определяющее минимальное число выводимых символов. Если число символов в выводном значении меньше, чем определено в width, то пробелы дополняются справа или слева (в зависимости от значения флага). Спецификация никогда не вызывает обрезание значащих символов в выводимом значении, всегда печатаются все символы. Обрезание значений возможно только при указании параметра: precision. Если в поле width спецификации стоит знак "звёздочка", то в этом случае сам текущий аргумент из списка аргументов (имеющий тип int ) предполагается как значение, задающее минимальное количество символов. Это значение задаётся переменной в списке аргументов, она должна предшествовать выводимому значению;
  • precision - неотрицательное целое число, определяет точное число символов, которые должны быть напечатаны, или место десятичной точки. Позволяет сузить и округлить значение вещественных (не целых) чисел. Если в поле precision спецификации стоит знак "звёздочка", то в этом случае сам текущий аргумент из списка аргументов (имеющий тип int ) предполагается как значение, задающее минимальное количество символов. Это значение задаётся переменной в списке аргументов, она должна предшествовать выводимому значению. Смысл параметра precision приведён в таблице 6.4;
  • F - префикс к аргументу, указывающий, что используется "дальний указатель" на память;
  • N - префикс к аргументу, указывающий, что используется "ближний" указатель на память;
  • l - указывает, что используется "длинная" ("long") разновидность типа данных (например, long int );
  • h - указывает, что используется "короткая" ("short") разновидность данных (например, short int );

Спецификация форматов не содержит внутри себя пробелы, каждое её поле - одиночный символ или число. Символ type, который появляется после последнего поля формата, должен соответствовать типу выводимых значений переменной;

значение символа type указано в таблице 6.3;

Таблица 6.2. Значение символа: type в строке форматов функции scanf
Спецификации формата функции scanf
Символ типа Ожидаемый ввод Тип аргумента
Числа
d десятичное целое указатель на целое (int *arg)
D десятичное целое указатель на длинное целое (long *arg)
o восьмеричное целое указатель на целое (int *arg)
O восьмеричное целое указатель на длинное целое (long *arg)
i десятичное, восьмеричное или шестнадцатеричное целое указатель на длинное целое (long *arg)
u десятичное целое без знака указатель на целое без знака (unsigned int *arg)
U десятичное целое без знака указатель на длинное целое без знака (unsigned long *arg)
x шестнадцатеричное целое указатель на целое (int *arg)
X шестнадцатеричное целое указатель на длинное целое (long *arg)
e число с плавающей точкой указатель на число с плавающей точкой (float *arg)
E число с плавающей точкой указатель на число с плавающей точкой (float *arg)
f число с плавающей точкой указатель на число с плавающей точкой (float *arg)
g число с плавающей точкой указатель на число с плавающей точкой (float *arg)
G число с плавающей точкой указатель на число с плавающей точкой (float *arg)
Символьные данные
s строка символов указатель на массив символов (char arg[])
Примечание: Размер массива должен быть по крайней мере (n+1) байтов, где n – длина строки s (в символах). Входное поле оканчивается пробелом или символом перехода на новую строку. К символьной строке автоматически добавляется нулевое окончание "\0" и записывается как последний элемент массива. В принципе, использовать такой способ ввода символьных знаков опасно: лучше использовать связку функций: fgets + sscanf.
c символ указатель на символ (char *arg); если ширина поля w задаётся вместе с символом типа c (как например: %5c) – указатель на массив из w символов (char arg[w]);
% символ % Никакого преобразования не происходит; символ % читается, но не сохраняется.
Указатели
n отсутствует указатель на целое (int *arg). Данный указатель хранит количество считанных символов до %n.
p шестнадцатеричное число в форме YYYY:ZZZZ или ZZZZ указатель на данный объект (дальний или ближний). Преобразования %p предусматривают стандартный размер указателя, принятый в данной модели памяти.
Таблица 6.3. Значение символа: type в строке форматов функции printf
Спецификация форматов функции printf
Символ преобразования Входной аргумент Выходной аргумент
Целые данные
d целое целое десятичное со знаком
i целое целое десятичное со знаком
o целое целое восьмеричное без знака
u целое целое десятичное без знака
x целое целое шестнадцатеричное без знака (с буквами a, b, c, d, e, f)
X целое целое шестнадцатеричное без знака (с буквами A, B, C, D, E, F).
f с плавающей точкой значение со знаком в форме [-]dddd.dddd
e с плавающей точкой значение со знаком в форме [-]d.dddde[+/-]ddd
g с плавающей точкой значение со знаком либо в форме f, либо в форме e, с данным значением и точностью. Хвостовые нули и десятичная точка печатаются только при необходимости
E с плавающей точкой так же, как в случае e, только с буквой E для обозначения степени
G с плавающей точкой так же, как в случае g, только с буквой E для обозначения степени
Символьные данные
c символьное один символ
s указатель на строку печатает символы до тех пор, пока не встретится нулевое окончание, либо не будет достигнута заданная длина строки.
% нет символа печатается только знак %
Указатели
n указатель на целое сохраняется (по адресу, указанному во входном аргументе) количество только что записанных символов.
p указатель печатает входной элемент как указатель; дальние указатели печатаются, как XXXX:YYYY, ближние указатели печатаются, как YYYY (только смещение).
Соглашения
e или E аргумент преобразуется в соответствии с шаблоном:

[-]d.ddd...e[+/-]ddd, где

  • одна цифра предшествует десятичной точке;
  • число цифр после десятичной точки равно точности;
  • степень всегда содержит три цифры.
f аргумент преобразуется в десятичную форму в соответствии с шаблоном [-]ddd.ddd..., где число десятичных цифр после запятой равно точности (если дана ненулевая точность).
g или G аргумент печатается по принципу e, E или f, с точностью, обозначающей число значащих цифр. Хвостовые нули удаляются, десятичная точка ставится только при необходимости. Аргумент печатается по принципу e или f (c некоторыми ограничениями), если символ преобразования g, и по принципу E или f, если указан символ преобразования G. Данные печатаются только в научном формате, если экспонента, полученная в результате либо a) больше, чем точность, либо b) меньше, чем -4.
Замечание. Неопределённые значения (бесконечность) печатаются как +INF и -INF, Не числа IEEE печатаются как +NAN или -NAN.
Таблица 6.4. Значение символа: precision в строке форматов функции printf
Флаги функции printf и их интерпретация
Флаг Что означает
- Левое выравнивание результата, пробелы остаются справа. Если флаг не задан, результат выравнивается справа, заполняется пробелами или нулями слева.
+ Знаковое преобразование: результат всегда начинается со знака '+' или '-'.
пусто Если значение не отрицательно, вывод начинается с пробела вместо плюса; отрицательные значения всегда начинаются со знака минус.
# Специфицирует, что преобразуемый аргумент используется в "альтернативной" форме. Смотри таблицу ниже.
Примечание: Знак плюс имеет приоритет над пробелом в обоих случаях.
Символ преобразования Как # влияет на результат
c, s, d, i, u Не оказывает влияния.
x или X 0x (или 0X)предшествует значению аргумента.
e, E, или f Результат всегда будет содержать десятичную точку, даже если за точкой не следует никаких цифр. Обычно десятичная точка появляется в результате, если за точкой следует цифра.
g или G Аналогично e или E, с дополнением, что хвостовые нули не удаляются.

СПЕЦИФИКАЦИЯ ФОРМАТА ФУНКЦИИ SCANF

СИНТАКСИС: %[*][width][F|N][h|l|L]type, где

  • Знак '*', следующий за символом процента, запрещает присваивание полученного значения по адресу, заданного аргументом. Поле считывается, но в значение в память не записывается;
  • width - положительное десятичное целое число, определяющее максимальное число символов, которые будут прочитаны из потока stdin согласно спецификации аргумента. Не более чем width считываются и участвуют в присвоении значения, но если встречается пробельный символ или символ, не преобразуемый в указанном формате, ввод завершится раньше;
  • F - префикс к аргументу, указывающий, что используется "дальний указатель" на память;
  • N - префикс к аргументу, указывающий, что используется "ближний" указатель на память;
  • l - указывает, что используется "длинная" ("long") разновидность типа данных (например, long int );
  • h - указывает, что используется "короткая" ("short") разновидность данных (например, short int );
  • значение символа type указано в таблице 6.2.

Описание строки форматов функции writef на языке PROLOG:

Таблица 6.5. Значения строки форматов:
Спецификация что она означает
- (дефис) показывает, что поля выравниваются слева; правое выравнивание действует по умолчанию (необязательный параметр).
m поле десятичное число, описывающее минимальный размер поля (необязательный параметр).
.p поле описывает или точное представление числа с плавающей точкой, или максимальное количество напечатанных в строке символов (необязательный параметр).
f поле описывает другие форматы, которые умалчиваются для данного объекта (необязательный параметр).
Таблица 6.6. Значение полей формата функций ввода-вывода языка "Turbo Prolog"
описание в f поле что оно означает
f Формат вещественного в фиксированной десятичной системе счисления (такой, как 123.4 или 0.004321).
lf Формат вещественного в фиксированной десятичной системе счисления (такой, как 123.4 или 0.004321). Используется для совместимости с языком Си.
e Формат вещественного в экспоненциальной форме представления.
G Формат вещественного в коротком формате (это используется по умолчанию для вещественного).
d Формат символов или целых чисел как десятичное число.
u Формат символов или целых чисел как десятичное число без знака.
x Формат символов или целых чисел как шестнадцатеричного числа.
с Формат символов или целых чисел как символа.
R Использует аргумент как ссылку на номер указателя базы данных (только ref домен).
X Использует аргумент как длинное шестнадцатеричное число (строки, номер указателя базы данных).
s Формат как строка (символов и строк).
Таблица 6.7. СПЕЦИАЛЬНЫЕ СИМВОЛЫ языка Turbo Prolog:
\n Новая строка (EOL);
\t Горизонтальная табуляция;
\nnn Символ с кодом nnn в текущей кодировке;

Более подробное описание форматов функций printf и scanf языка Си смотрите [3], а функции writef языка Turbo Prolog - в [53].

Дмитрий Карпов
Дмитрий Карпов
Россия, Нижний Новгород
Олег Корсак
Олег Корсак
Латвия, Рига