Таблица 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.