Опубликован: 15.11.2010 | Доступ: свободный | Студентов: 753 / 47 | Оценка: 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].