Опубликован: 15.11.2010 | Доступ: свободный | Студентов: 745 / 44 | Оценка: 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;
Спецификации формата функции 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 предусматривают стандартный размер указателя, принятый в данной модели памяти. |
Флаги функции 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:
Спецификация | что она означает |
---|---|
- (дефис) | показывает, что поля выравниваются слева; правое выравнивание действует по умолчанию (необязательный параметр). |
m поле | десятичное число, описывающее минимальный размер поля (необязательный параметр). |
.p поле | описывает или точное представление числа с плавающей точкой, или максимальное количество напечатанных в строке символов (необязательный параметр). |
f поле | описывает другие форматы, которые умалчиваются для данного объекта (необязательный параметр). |
описание в f поле | что оно означает |
---|---|
f | Формат вещественного в фиксированной десятичной системе счисления (такой, как 123.4 или 0.004321). |
lf | Формат вещественного в фиксированной десятичной системе счисления (такой, как 123.4 или 0.004321). Используется для совместимости с языком Си. |
e | Формат вещественного в экспоненциальной форме представления. |
G | Формат вещественного в коротком формате (это используется по умолчанию для вещественного). |
d | Формат символов или целых чисел как десятичное число. |
u | Формат символов или целых чисел как десятичное число без знака. |
x | Формат символов или целых чисел как шестнадцатеричного числа. |
с | Формат символов или целых чисел как символа. |
R | Использует аргумент как ссылку на номер указателя базы данных (только ref домен). |
X | Использует аргумент как длинное шестнадцатеричное число (строки, номер указателя базы данных). |
s | Формат как строка (символов и строк). |
\n | Новая строка (EOL); |
\t | Горизонтальная табуляция; |
\nnn | Символ с кодом nnn в текущей кодировке; |
Более подробное описание форматов функций printf и scanf языка Си смотрите [3], а функции writef языка Turbo Prolog - в [53].