Прототип функции форматного выводаимеет вид:


int pr


Обращение к ней выглядит следующим образом:


int printf(форматная_строка, список_аргументов);


Функция преобразует данные из внутреннего представления в символьный вид в соответствии с форматной строкой (первым аргументом) и выводит их в выходной поток. Данные, которые преобразуются и выводятся, задаются как аргументы.


Возвращаемое значение функции printf() – число напечатанных символов, а в случае ошибки – отрицательное число.


Форматная_строка ограничивается двойными кавычками и может включать произвольный текст, управляющие символы и спецификации преобразования данных. Текст и управляющие символы из форматной строки просто копируются в выходной поток, а вместо спецификаций подставляются значения аргументов, преобразованных в соответствии с этими спецификациями.


Спецификация преобразования имеет вид:


%флаги ширина_поля.точность модификатор спецификатор


В



printf(“радиус = %5.2f, площадь = %6.2f\n”, r, s);


Если переменные r и s имели значения, соответственно, 2 и 6.28, то на экран будет выведено сообщение:


радиус = 2.00, площадь = 6.28


Рассмотрим более подробно элементы спецификации.


Спецификаторопределяет, как будет интерпретироваться соответствующий аргумент: как символ, как строка или как число. Наиболее часто используются следующие спецификаторы:


Спецификатор

Тип аргумента

Формат вывода

d

int, char, unsigned

Десятичное целое со знаком

i

int, char, unsigned

Десятичное целое со знаком

u

int, char, unsigned

Десятичное целое без знака

o

int, char, unsigned

Восьмеричное целое без знака

x

int, char, unsigned

Шестнадцатеричное целое без знака

f

double, float

Вещественное с плавающей точкой со знаком

e

double, float

Вещественное с фиксированной точкой со знаком

c

int, char, unsigned

Одиночный символ

s

char *

Символьная строка. Символы печатаются либо до первого нулевого символа (‘\0’), либовыводится то количество символов, которое задается элементом спецификации точность.


Флаги управляют выравниванием вывода и печатью знака числа, пробелов, десятичной точки, префиксов восьмеричной и шестнадцатеричной систем счисления.

- Выводимое изображение прижимается к левому краю. По умолчанию выравнивание происходит по правой границе.

+ Перед числом выводится его знак («+» или «-»). По умолчанию знак выводится только для отрицательных чисел.

пробел Используется для вставки пробела на месте знака перед положительным числом.

# Если этот флаг используется с форматом «o» или «x», то значения выводятся с предшествующим 0 или 0x. При использовании с форматом «f» десятичная точка будет выводиться даже если в числе нет дробной части.


Ширина_поля задает минимальное количество позиций, отводимое для представления выводимого значения.


Точность задает:

  • минимальное число цифр, которые могут быть выведены при использовании спецификаторов d,i,u,o,x;
  • число цифр, которые будут выведены после точки при спецификаторах f или e;
  • максимальное число символов, которые будут выведены при спецификаторе s.

Модификаторы имеют следующий смысл:

  • h и следующий за ним спецификатор d,i,u,o,x преобразуют выводимое значение к типу
  • l и следующий за ним спецификатор d,i,u,o,x преобразуют выводимое значение к типу long или unsigned long.
  • L и следующий за ним спецификатор e или f преобразуют выводимое значение к типу long double.


Прототип функции форматного ввода имеет вид:



Обращение к ней выглядит следующим образом:


int scanf(форматная_строка, список_аргументов);


Функция scanf() читает последовательность кодов символов из входного потока и интерпретирует их в соответствии с форматной_строкой как целые числа, вещественные числа, одиночные символы, строки.


После преобразования во внутреннее представление данные записываются в области памяти, определенные аргументами, которые следуют за форматной строкой. Каждый аргумент должен быть указателем на переменную, в которую будет записано очередное значение.


Функция scanf() считывает из входного потока до появления первого пробельного символа или когда считано количество символов, указанное в спецификации преобразования.

Работа функции прекращается при достижении конца форматной строки. При успешном завершении возвращается количество объектов, получивших значение при вводе.


Форматная строка ограничена двойными кавычками и может включать:

  • пробельные символы, которые указывают на то, что из входного символа нужно считать, но не сохранять все последовательные пробельные символы, вплоть до появления непробельного символа.
  • обычные символы, отличные от пробельных и символа %. Обработка такого символа сводится к чтению очередного символа из входного потока. Если считанный символ отличается от обрабатываемого символа форматной строки, функция завершается с ошибкой. Несовпавший символ ипоследующие входные символы остаются непрочитанными.
  • спецификации преобразования.


Спецификация преобразования имеет следующую форму:

% * ширина_ поля модификатор спецификатор


Все символы в спецификации являются необязательными, за исключением символа ‘%’ и спецификатора, позволяющего указать ожидаемый тип элемента во входном потоке.


Наиболее часто используются следующие спецификаторы:


Спецификатор

Ожидаемый тип вводимых данных

Тип аргумента

d

Десятичное целое

int *

o

Восьмеричное целое

int *

x

Шестнадцатеричное целое

int *

i

десятичное, восьмеричное, шестнадцатеричное целое без знака

int *

u

десятичное целое без знака

unsigned int *

f, e

Вещественное значение

float *

c

Все считываемые символы воспринимаются как значимые. Пропуск начальных пробельных символов подавляется.

char *

s

Строка символов, ограниченная справа и слева пробельными символами.

char *


Необязательные элементы спецификации преобразования имеют следующий смысл:


* - звездочка, следующая за процентом, запрещает запись прочитанного значения по адресу, задаваемому аргументом. Прследовательность кодов из входного потока прочитывается, но не преобразуется и не записывается.


Ширина_поля - положительное десятичное число, определяющее максимальное сичло символов, которое может быть прочитано из входного потока.


Модификатор- задает длину переменной, в которую помещается вводимое значение. Модификатор может принимать значения:

  • h - означает, что аргумент должен быть указателем на тип
  • l - означает, что аргумент должен быть указателем на тип
  • L - означает, что аргумент должен быть указателем на тип long double.