Printf C: описание, форматирование, примеры
Стандартная функция консольного вывода в языке C – printf. Описание её содержится в заголовочном файле stdio.h. При помощи этой функции можно выводить данные или пользовательские сообщения в консоль. Язык C чувствителен к регистру. К примеру, две функции printf и scanf отличаются от подобных им Printf и Scanf. Все символы в функциях printf и scanf также должны быть записаны в нижнем регистре. Одним из простейших примеров C printf, выводящим на экран знакомое приветствие hello world, является:
Определение функций группы printf в файле "stdio.h"
Файл "stdio.h" относится к стандартной библиотеке ввода/вывода в языке С. Описание printf и подобных ей функций приводится в нём следующим образом:
Перечисленные функции производят загрузку данных из определённых локаций, преобразовывают их в символьную строку, отправляют в заданные потоки вывода.
Семейство функций printf
Функции группы printf в языке C служат для обработки и форматированного вывода данных в стандартный поток. Причём функции printf и vprintf производят запись в стандартный поток stdout, функции fprintf и vfprintf отправляют значения выводимых аргументов в некоторый заданный выходной поток, а snprintf, sprintf, vsnprintf и vsprintf записывают данные в символьную строку. Все перечисленные функции работают с использованием строки формата, указывающей необходимые преобразования аргументов для вывода.
Функция fprintf записывает результат в выходной поток stream. В буфер, представляющий собой символьную строку, выводит результат функция sprintf. Поведение функции не определено, если подлежащая выводу строка превышает размер массива буфера.
Функция snprintf так же, как и предыдущая, записывает данные в строковый буфер. Полученная строка символов завершается нулевым символом, если только bufsz (размер буфера) не равен нулю. Иначе, если значение bufsz равно нулю, то в буфер ничего не выводится, а сам буфер вполне может являться нулевым указателем, но возвращаемое значение (количество байтов, которое должно было быть записано) все равно вычисляется.
Функция printf_s в целом действует тем же образом, что и printf, за исключением одного момента. Главным отличием в описании printf_s в C и printf является следующее: функция printf_s выполняет проверку строки форматирования на наличие допустимых символов в отличие от printf, которая только проверяет строку формата на предмет пустого указателя.
Подробнее рассмотрим функцию printf.
Общее описание
В языке C печать символов через стандартный поток вывода осуществляется посредством вызова функции printf. Команда printf в C форматирует набор выводимых данных, и они отправляются в стандартный поток вывода stdout. Значения, переданные в качестве аргументов функции, выводятся в консоль согласно указанной строке форматирования, которая в свою очередь заключает в себе две разновидности элементов. Первая разновидность - это символы, выводимые на экран, а элементы, определяющие особенности формата данных и отвечающие за метод представления аргументов при выводе, относятся ко второму виду.
При выводе переменных с printf в C особые комбинации символов в строке аргументов заменяются на преобразованные в соответствии с этими символами данные, причём для каждого типа данных существуют свои спецификации формата вывода.
Тип функции и возвращаемое значение
Функция printf, имеющая тип int, возвращает целочисленную величину, обозначающую количество напечатанных на экране символов. К примеру, можно присвоить:
int k = printf("Привет %c %d %s", 'a', 11, "всем!"),
и тогда по значению переменной k легко определяется, возникла ли ошибка при выводе. В случае возврата отрицательного значения (если функция вернула "-1") можно сделать вывод, что произошла ошибка при её выполнении.
Синтаксис и зависимости
Чтобы использовать функцию printf, требуется подключить заголовочный файл "stdio.h" следующим образом:
#include <stdio.h>
Шаблон функции выглядит:
int printf(const char *формат, ...)
Под многоточием подразумевается список аргументов, подлежащих выводу. Функция printf может быть использована с различным числом аргументов, но первый из них всегда ограничивается с обеих сторон двойными кавычками, а каждый последующий необходимо отделять от предыдущего запятой. То, что записано в двойных кавычках и при том не является спецификацией формата, печатается без изменений, иначе, если встретился спецификатор, копируется тип его значения.
Форма задания спецификаций формата:
%[флаги][ширина][.позиция][длина]тип
Форматирование с printf в C выходных значений
Чтение строки формата, указываемой в круглых скобках после имени вызываемой функции, происходит только в одну сторону: слева направо, и первый аргумент, указанный после самой этой строки, выводится лишь в том случае, если встретилась первая спецификация. До тех пор, пока не кончится строка формата, указанные в ней спецификации будут инициировать преобразование и печать последующих аргументов. В строке формата знак пробела рассматривается, как обычный символ и передаётся на вывод в случаях, когда он не используется в выражении спецификации формата.
Символ "%" указывает на начало спецификации формата вывода, следом за ним идёт код формата. Все поля в спецификации представляют собой отдельные, определяющие условия форматирования числа или символы.
Форматированный вывод printf в C обладает своими особенностями. В случае, если количество перечисленных аргументов превышает число спецификаций формата, они пропускаются и не выводятся. Иначе, если спецификаций формата больше, чем значений в списке подлежащих печати аргументов, результат вызова функции не определяется.
Для явного указания, который по счёту аргумент нужно задействовать, возможно использовать "%m$" вместо "%" и "*m$" вместо "*", причём m, целочисленное десятичное значение, обозначает позицию нужного аргумента (индексирование начинается с единицы).
Параметры
stream | Выходной поток для записи в файл |
buffer | Указатель на символьную строку для последующей записи в неё |
bufsz | Определяет число символов, допустимое для записи: максимальное значение - bufsz-1, и ещё нулевой ограничитель |
format | Указатель на многобайтовую строку с нулевым ограничителем, определяющую, как интерпретировать выводимые аргументы |
Флаг | Описание |
- | Выравнивание результата по левому краю в поле вывода |
+ | При выводе численного значения, имеющего знак, принудительно печатается "+" перед положительной величиной (по умолчанию выводится только "-" перед отрицательным значением) |
0 | Для целых чисел и чисел с плавающей запятой ведущие нули используются вместо символов пробела для заполнения левых разрядов в случае, если задана ширина поля, превышающая длину числа. Для целых чисел флаг игнорируется, если явно указана точность. Для других преобразований с использованием этого флага поведение функции не определено. Флаг "0" не учитывается, если присутствует флаг "-" |
space | Если результат вывода выражения, имеющего знак, не начинается с символа этого знака или пуст, то пробел добавляется к результату. Флаг "space" игнорируется, если присутствует флаг "+" |
# | Выполняется альтернативная форма преобразования |
Последовательность | Результат |
\a | Звуковой сигнал |
\n | Перевод на новую строку |
\r | Возвращение курсора в начало строки |
\t | Табуляция |
\v | Вертикальная табуляция |
\" | Вывод двойной кавычки |
\\ | Вывод косой черты |
Различные спецификаторы формата
Спецификатор формата | Использование и описание для printf C | Тип аргумента |
% | Запись литерала "%" | |
c | Вывод одного символа. Происходит преобразование аргумента в тип unsigned char. При использовании модификатора "l" аргумент преобразуется в строку символов | unsigned char |
s | Печать строки символов. Аргумент должен являться указателем на начальный элемент массива символов char | char * |
d i | Вывод десятичного представления целочисленного значения со знаком | int |
o | Вывод восьмеричного представления без знакового целочисленного значения | unsigned int |
x X | Вывод шестнадцатеричного представления без знакового целочисленного значения. Символы "a", "b", "c", "d", "e", "f" применяются для преобразования "x". А для преобразования "X" - "A", "B", "C", "D", "E", "F" | unsigned int |
u | Вывод десятичного преобразования без знакового целочисленного значения. Если преобразованное значение и точность вместе равны 0, то символы не выводятся | unsigned int |
f F | Вывод десятичного представления числа с плавающей запятой, имеющего знак | double |
e E | Вывод десятичного экспоненциального представления числа с плавающей запятой, округлённого и преобразованного так, что перед запятой остаётся одна цифра, а количество цифр после запятой соответствует точности представления (по умолчанию точность равна 6, а если указан 0, то символ запятой не выводится вообще). Символ "е" выводится в верхнем или нижнем регистре в зависимости от преобразования | double |
a A | Вывод шестнадцатеричного представления числа с плавающей запятой | double |
g G | Вывод десятичного представления числа с плавающей запятой или его десятичного экспоненциального представления в зависимости от значения и точности | double |
n | Возврат числа элементов, выведенных функцией printf. Результат записывается в переменную, на которую указывает аргумент. Спецификация может не содержать флагов, ширины поля или точности | int * |
p | Вывод указателя | void * |
Модификатор ширины поля
В строке формата в printf C может быть записано целое число после знака процента и перед командой форматирования. Оно является модификатором ширины поля и влияет на представление отображаемых данных. Наименьшая ширина поля, предназначенная для значения, определяется этим числом, и присутствие такого модификатора в случае, если аргумент оказывается меньше выделенного ему поля, вызывает добавление к результату пробелов или нулей. Заполнителем по умолчанию служит символ пробела, однако можно установить ноль, прописав его перед спецификацией ширины. Модификатор указывает минимум ширины, и любое превышающее этот минимум значение будет напечатано без помех. Число, к примеру, состоящее менее чем из восьми символов и печатаемое со спецификацией "%08d", окажется дополненным до необходимых восьми знаков нулями.
Подобные модификаторы могут также задавать параметры точности или выравнивания.
Модификатор точности
Модификатор точности служит для определения числа печатаемых десятичных знаков в представлении чисел. Для добавления модификатора точности необходимо поставить точку после спецификации ширины поля и указать нужное значение точности после неё. Модификатор точности определяется для "e", "f", "a", "E", "A" и "F" форматов. Для целых чисел модификатор устанавливает количество отображаемых цифр, добавляя нули в левый разряд, если нужно, а при выводе рациональных чисел определяет необходимое количество знаков после запятой. Применительно к строковым переменным: следующее после точки число в модификаторе точности служит определителем максимальной длины поля при выводе. К примеру, при заданной спецификации формата "%4.8s" будет выведена строка, длина которой находится в диапазоне от четырёх до восьми символов, в случае превышения крайние символы будут опущены.
Другие модификаторы формата
Выравниванием по умолчанию является выравнивание по правому краю, однако это можно изменить, поставив знак "-" после "%". Такая спецификация формата устанавливает выравнивание по левому краю.
Кроме того, функция printf способна различать короткие и длинные типы выводимых целых значений. Допустимые спецификаторы: "о", "d", "u", "i", "x" и "X". Длинный тип значения устанавливается модификатором "l", а короткий – модификатором "h". Например, при выводе длинного целого числа и значения типа short unsigned int спецификации формата выглядят как "%ld" и "%hu" соответственно.
Длина | Описание |
h | Для типов short или unsigned short |
l | Для типов long или unsigned long |
L | Для типа long double |
Примеры
1. Описание printf C и результаты вызова каждой функции:
2. Вывод на экран простого диалогового сообщения:
printf("сообщение");
3. Программный код:
Выражения, заданные в двойных кавычках перед спецификациями формата, печатаются на экране, также как и следующие за строкой формата аргументы. Результат выполнения приведённых выше функций printf C, описание выходных данных:
Данный пример иллюстрирует вывод на экран при помощи различных форматов строк, целочисленных переменных, символов, а также чисел с плавающей точкой.
Стандартная функция ввода scanf и примеры её использования
Функция scanf используется для чтения вводимых с клавиатуры данных. Описание printf и scanf в C представлено в заголовочном файле "stdio.h".
scanf("format specifiers",&value1,&value2, ...);
Простой пример работы с функцией scanf:
#include <stdio.h>
int main(){
int a;
float b;
scanf("%d%f",&a,&b);
}