Книга: Основы программирования в Linux
printf, fprintf и sprintf
printf, fprintf и sprintf
Семейство функций printf
форматирует и выводит переменное число аргументов разных типов. Способ их представления в потоке вывода управляется параметром format
, являющимся строкой с обычными символами и кодами, называемыми спецификаторами преобразований, указывающими, как и куда выводить остальные аргументы.
#include <stdio.h>
int printf(const char *format, ...);
int sprintf(char *s, const char *format, ...);
int fprintf(FILE * stream, const char *format, ...);
Функция printf
выводит результат в стандартный вывод. Функция fprintf
выводит результат в заданный файловый поток stream
. Функция sprintf
записывает результат и завершающий нулевой символ в строку s, передаваемую как параметр. Эта строка должна быть достаточно длинной, чтобы вместить весь вывод функции.
У семейства printf
есть и другие члены, обрабатывающие свои аргументы различными способами. См. подробную информацию на страницах интерактивного руководства.
Обычные символы передаются в вывод без изменений. Спецификаторы преобразований заставляют функцию printf
выбирать и форматировать дополнительные аргументы, передаваемые как параметры. Спецификаторы всегда начинаются с символа %
. Далее приведен простой пример:
printf("Some numbers: %d, %d, and &dn", 1, 2, 3);
Он порождает в стандартном выводе следующую строку.
Some numbers: 1, 2, and 3
Для вывода символа %
следует применять последовательность %%
, чтобы не путать его со спецификатором преобразования.
Далее перечислены наиболее часто применяемые спецификаторы преобразований:
? %d
, %i
— выводить целое как десятичное число;
? %о
, %x
— выводить целое как восьмеричное, шестнадцатеричное число;
? %с
— выводить символ;
? %s
— выводить строку;
? %f
— выводить число с плавающей точкой (одинарной точности);
? %e
— выводить число с двойной точностью в формате фиксированной длины;
? %g
— выводить число двойной точности в общем формате.
Очень важно, чтобы число и тип аргументов, передаваемых функции printf
, соответствовали спецификаторам преобразования в строке format
. Необязательный спецификатор размера применяется для обозначения типа целочисленных аргументов.
Он может быть равен h
, например, %hd
для обозначения типа short int
(короткие целые), или l
, например, %ld
для обозначения типа long int
(длинные целые). Некоторые компиляторы могут проверять эти установки printf
, но они ненадежны. Если вы применяете компилятор GNU gcc, можно вставить для этого в команду компиляции опцию -Wformat
.
Далее приведен еще один пример:
char initial = 'А';
char *surname = "Matthew";
double age = 13.5;
printf("Hello Mr %c %s, aged %gn", initial, surname, age);
Будет выводиться следующая информация:
Hello Mr A Matthew, aged 13.5
Вы можете добиться большего при выводе элементов с помощью спецификаторов полей. Они расширяют возможности спецификаторов преобразований, управляя расположением элементов при выводе. Обычно задается количество десятичных разрядов для числа с плавающей точкой или величина пробельных отступов, обрамляющих строку.
Спецификаторы полей задаются в виде чисел, следующих в спецификаторах преобразований непосредственно за знаком %
. В табл. 3.5 приведены дополнительные примеры использования спецификаторов преобразований и результирующий вывод. Для большей ясности мы применяем знак вертикальной черты, чтобы показать границы вывода.
Таблица 3.5
Формат | Аргумент | Вывод |
---|---|---|
%10s |
"Hello" |
| Hello| |
%-10s |
"Hello" |
|Hello | |
%10d |
1234 |
| 1234| |
%-10d |
1234 |
|1234 | |
%010d |
1234 |
|0000001234| |
%10.4f |
12.34 |
| 12.3400| |
%*s |
10, "Hello" |
| Hello| |
Все приведенные примеры выводятся в поле шириной 10 символов. Обратите внимание на то, что отрицательная ширина поля означает выравнивание элемента по левому краю в пределах поля. Переменная ширина поля обозначается символом "звездочка" (*
). В этом случае следующий аргумент применяется для задания ширины. Ведущий ноль указывает на вывод элемента с ведущими нулями. В соответствии со стандартом POSIX функция printf
не обрезает поля; наоборот она расширяет поле, чтобы вместить в него аргумент. Например, если вы попытаетесь вывести строку большей длины, чем заданное поле, ширина поля будет увеличена (табл. 3.6).
Таблица 3.6
Формат | Аргумент | Вывод |
---|---|---|
%10s |
"HelloTherePeeps" |
|HelloTherePeeps| |
Функции семейства printf
возвращают целое число, равное количеству выведенных символов. В случае функции sprintf
в него не включается завершающий нуль-символ. При наличии ошибок эти функции возвращают отрицательное значение и задают переменную errno
.
- Функции fprintf( ) и fscanf( )
- Модификаторы спецификации преобразования, используемые в функции printf( )
- 13.2.5. Высокоуровневое числовое и денежное форматирование: strfmon() и printf()
- 13.3.5. Перестановка порядка слов с помощью printf()
- 15.5.1. Библиотека dbug — усовершенствованный printf()
- ВВОД-ВЫВОД ФАЙЛА: fprintf( ), fscanf( ), fgets( ) И fputs( )
- 4. Символьные строки директива #define, функции printf( ) и scanf( )
- ИЗУЧЕНИЕ И ИСПОЛЬЗОВАНИЕ ФУНКЦИЙ printf( ) И scanf( )
- Пример 11-1. printf в действии
- 7.2 Форматный вывод (printf)
- Использование функции printf( )
- Функция printf( )