Таблица 3. Символы типов данных строки формата функции printf
Таблица 7.2. Значения флагов строки формата функции printf
Таблица 1. Еsс - последовательности
Функция printf
Функция printf
Просматривая программы, написанные разными людьми, вы часто можете встретить функцию printf. Этот стандартный оператор вывода пришел из языка С. Так как C++ является расширением С, эта функция поддерживается и в этом языке. Многие программисты до сих пор предпочитают использовать старую функцию printf, а не потоки ввода/вывода C++. Вот почему вам эта функция наверняка уже знакома. Но, помимо этого, эта функция имеет несколько очень мощных возможностей, и в ряде случаев она оказывается удобнее функций потоков. Прототип функций можно найти в заголовочном файле STDIO.H.
Общая форма объявления функции printf:
int printf(const char *format[, argument,... ]);
Параметр format является символьным массивом, содержащим выводимый текст. Кроме этого обязательного параметра, могут быть необязательные аргументы. Массив format может содержать специальные форматирующие символы, которые выполняют преобразование необязательных аргументов при выводе.
|
|
|
Функция printf является очень мощной функцией с богатыми возможностями форматирования вывода. В качестве первого шага в освоении ее возможностей рассмотрим Esc-последовательности, позволяющие представлять специальные символы. Esc-последовательность начинается с символа «\» — «обратная косая черта». Esc-коды представлены в таблице 1.
| Последовательность | Десятичное значение | Шестнадцатеричное значение | Название |
| \а | 0х07 | Звонок | |
| \b | 0х08 | Возврат назад | |
| \f | 0х0С | Перевод страницы | |
| \n | 0х0А | Новая строка | |
| \г | 0x0D | Возврат каретки | |
| \t | 0х09 | Табуляция | |
| \v | 0х0В | Вертикальная табуляция | |
| \\ | 0х5С | Обратная черта | |
| \' | 0х2С | Апостроф | |
| \" | 0х22 | Кавычка | |
| \? | 0х3 F | Знак вопроса | |
| \0 | Восьмеричное число, от 1 до 3 цифр | ||
| \XHHH и \xhhh | 0xhhh | Шестнадцатеричное число |
Функция printf имеет специальные форматирующие спецификации (символы) для вывода переменных. Общий вид этих спецификаций таков:
% [flags] [width] [.precision] [F | N | h | l | L ] <символ типа>
Опции flags могут определять выравнивание, отображение знака числа при выводе, вывод десятичной точки и символов заполнения. Кроме того, эти флаги определяют префиксы для восьмеричных и шестнадцатеричных чисел. Возможные значения флагов приведены в таблице 2.
| Символ | Назначение |
| - | Выравнивать вывод по левому краю поля |
| + | Всегда выводить знак числа |
| Пробел | Выводить пробел перед положительным числом и знак минус — перед отрицательным |
| # | Не влияет на вывод десятичных целых, для шестнадцатеричных чисел выводит префикс 0х или 0Х, перед восьмеричными целыми выводит ноль, десятичную точку для вещественных чисел. |
Спецификация width определяет минимальное количество выводимых символов. Если необходимо, используются заполнители — пробелы или нули. Когда значение для width начинается с нуля, printf использует в качестве заполнителей нули, а не пробелы. Если в качестве значения для width используется универсальный символ *, а не число, то printf подставляет на место этого символа значение, которое должно содержаться в списке аргументов. Это значение ширины поля должно предшествовать выводимому значению. Ниже приведен пример вывода числа 2, занимающего три позиции, согласно значению второго аргумента printf:
|
|
|
printf("%*d", 3, 2);
Спецификатор precision определяет максимальное количество выводимых цифр. В случае целого числа он определяет минимальное количество выводимых символов. Для precision также можно применить символ *, вместо которого будет подставлено значение из списка аргументов. Это значение точности представления должно предшествовать выводимому значению. Ниже приведен пример вывода числа с плавающей точкой 3.3244 с использованием десяти символов, как это задано вторым аргументом printf:
printf("%7.*f", 10, 3.3244);
Символы F, N, h, l и L являются символами размера, переопределяющими размер по умолчанию. Символы F и N применяются с указателями, far и near соответственно. Символы h, l, и L используются для указания соответственно типов short int, long или long double.
Символам типа данных должен предшествовать форматирующий символ %. В таблице 7.2 мы показали возможные значения флагов форматирующей строки printf. Символы типов данных перечислены в таблице 7.3.
| Тип данных | символ типа | результат |
| Символ | c | Один символ |
| d | Десятичное целое со знаком | |
| i | Десятичное целое со знаком | |
| O | Восьмеричное целое без знака | |
| N | Десятичное целое без знака | |
| X | Шестнадцатеричное целое без знака; набор цифр - 0123456789abcdef | |
| X | Шестнадцатеричное целое без знака; набор цифр - 0123456789ABCDEF | |
| Указатель | P | Для указателей near выводит только смещение в виде: 0000. Указатели far отображаются в виде: SSSS:0000 |
| Указатель на целое | N | |
| Вещественное | F | Выводит величину со знаком в формате [-]dddd.dddd |
| E | Выводит вещественную величину со знаком в экспоненциальном формате [-]d.dddde[+|-]ddd | |
| Е | Выводит вещественную величину со знаком в экспоненциальном формате [-]d.ddddE[+|-]ddd | |
| G | Выводит вещественную величину со знаком в формате f или е в зависимости от ее значения и заданной точности | |
| G | Выводит вещественную величину со знаком в формате F или Е в зависимости от ее значения и заданной точности | |
| Указатель | S | Выводит строку символов, пока не встретит нуль-терминатор строки |
Разберем небольшой пример. Программа OUT2.CPP, исходный код которой приведен в листинге 3, создана на основе программы OUT1.CPP. В этой программе используется форматированный вывод с использованием функции printf. Программа выводит те же числа, что и OUT1.CPP, используя три различных набора спецификаций преобразования.
| // Программа, использующая printf для форматирования вывода | |
| #include <stdio.h> | |
| int main() | |
| { | |
| int anInt = 67; | |
| Unsigned char aByte = 128; | |
| char aChar = '@'; | |
| Float aSingle = 355.0; | |
| Double aDouble = 1.130e+002; | |
| Printf("%3d + %2d = %3d\n", | |
| aByte, anInt, aByte + anInt); | |
| Printf("Вывод использует спецификации преобразования %%lf:\n"); | |
| Printf(" %6.4f / %10.4lf = %7.5lf\n", | |
| aSingle, aDouble, aSingle / aDouble); | |
| Printf("Вывод использует спецификации преобразования %%le:\n"); | |
| printf(" %6.4e / %6.4le = %7.5le\n", | |
| aSingle, aDouble, aSingle / aDouble); | |
| printf("Вывод использует спецификации преобразования %%lg:\n"); | |
| printf(" %6.4g / %6.4lg = %7.5lg\n", | |
| aSingle, aDouble, aSingle / aDouble); | |
| printf("Символьная переменная aChar: %c\n", aChar); | |
| printf("ASCII-код %c: %d\n", aChar, aChar); | |
| return 0; | |
| } |
Пример вывода программы из листинга 3:
|
|
|
128 + 67 = 195
Вывод использует спецификации преобразования %lf:
355.0000 / 113.0000 = 3.14159
Вывод использует спецификации преобразования %le:
3.5500e+02 / 1.1300e+02 = 3.14159e+00
Вывод использует спецификации преобразования %lg:
355 / 113 = 3.1416
Символьная переменная aChar: @
ASCII-код @: 64
В программе из листинга 3 объявляется целый набор переменных различных типов. Оператор вывода в строках 13 и 14 выводит целые, используя спецификацию формата %d. В таблице 4 приведены результаты действия спецификаций преобразования из строки 13. Обратите внимание на то, что первая переменная была преобразована из типа unsigned char в тип integer.






