Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab2.doc
Скачиваний:
63
Добавлен:
12.04.2015
Размер:
276.99 Кб
Скачать

Структура управляющей последовательности

Управляющая последовательность имеет вид:

%[флаги][ширина][.точность][размер]тип

Обязательными составными частями являются символ начала управляющей последовательности (%) и тип.

Флаги

Знак

Название знака

Значение

В отсутствие этого знака

Примечание

-

дефис

выводимое значение выравнивается по левому краю в пределах минимальной ширины поля

по правому

+

плюс

всегда указывать знак (плюс или минус) для выводимого десятичного числового значения

только для отрицательных чисел

 

пробел

помещать перед результатом пробел, если первый символ значения не знак

Вывод может начинаться с цифры.

Символ + имеет больший приоритет, чем пробел. Используется только для десятичных числовых значений.

#

октоторп

«альтернативная форма» вывода значения

см. ниже

0

ноль

дополнять поле до ширины, указанной в поле ширина управляющей последовательности, символом 0

дополнять пробелами

Используется для типов d, i, o, u, x, X, a, A, e, E, f, F, g, G. Для типов d, i, o, u, x, X, если точность указана, этот флаг игнорируется. Для остальных типов поведение не определено.

Спецификатор ширины

Ширина (десятичное число или символ звёздочка) указывает минимальную ширину поля (включая знак для чисел). Если представление величины больше, чем ширина поля, то запись выходит за пределы поля (например, %2i для величины 100 даст значение поля в три символа), если представление величины менее указанного числа, то оно будет дополнено (по умолчанию) пробелами слева, поведение может меняться предшествующими флагами. Если в качестве ширины указана звёздочка, ширина поля указывается в списке аргументов перед значением для вывода (например, printf( "%0*x", 8, 15 ); выведет текст 0000000f).

Спецификатор точности

  • указывает на минимальное количество символов, которое должно появиться при обработке типов d, i, o, u, x, X;

  • указывает на минимальное количество символов, которое должно появиться после десятичной запятой (точки) при обработке типов a, A, e, E, f, F;

  • максимальное количество значащих символов для типов g и G;

  • максимальное число символов, которые будут выведены для типа s;

Точность задаётся в виде точки с последующим десятичным числом или звёздочкой (*), если число или звёздочка отсутствует (присутствует только точка), то предполагается, что число равно нулю. Точка для указания точности используется даже в том случае, если при выводе чисел с плавающей запятой выводится запятая.

Если после точки указан символ «звёздочка», то при обработке строки форматирования значение для поля читается из списка аргументов. (При этом, если символ звёздочка и в поле ширины и в поле точности, сначала указывается ширина, потом точность и лишь потом значение для вывода). Например, printf( "%0*.*f", 8, 4, 2.5 ); выведет текст 00000002.5000.

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

Поле размер позволяет указать размер данных, переданных функции. Необходимость в этом поле объясняется особенностями передачи произвольного количества параметров в функцию в языке Си: функция не может «самостоятельно» определить тип и размер переданных данных, так что информация о типе параметров и точном их размере должна передаваться явно.

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

Знаковый тип

Беззнаковый тип

signed char

unsigned char

signed short (short)

unsigned short int (unsigned short)

signed int (int)

unsigned int (unsigned)

signed long int (long)

unsigned long int (unsigned long)

signed long long int (long long)

unsigned long long int (unsigned long long)

Точные размеры типов неизвестны за исключением типов signed char и unsigned char.

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

Тип char имеет одинаковый размер с типами signed char и unsigned char и общий набор представимых значений с одним из этих типов. Далее считается, что char — другое имя одного из этих типов; такое допущение приемлемо для настоящего рассмотрения.

Си++ имеет тот же набор типов, за исключением пары long long и unsigned long long. Впрочем, эти типы могут присутствовать в реализациях на правах языковых расширений.

Кроме того, в языке Си присутствует тип _Bool, а в Си++ — bool.

При передаче в функцию аргументов, которым не соответствуют формальные параметры в прототипе функции (а таковыми являются все аргументы, содержащие выводимые значения), эти аргументы подвергаются стандартным продвижениям, а именно:

  • аргументы типа float приводятся к типу double;

  • аргументы типов unsigned char, unsigned short, signed char и short приводятся к одному из следующих типов:

    • int, если этот тип способен представить все значения исходного типа, или

    • unsigned в противном случае;

  • аргументы типов _Bool или bool приводятся к типу int.

Таким образом, функции printf не могут получать аргументов типов float, _Bool или bool или целочисленных типов меньших, чем int или unsigned.

Набор применяемых спецификаторов размера зависит от спецификатора типа (см. ниже).

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

%d, %i, %o, %u, %x, %X

%n

Примечание

отсутствует

int или unsigned int

указатель на int

l

long int или unsigned long int

указатель на long int

hh

Аргумент имеет тип int или unsigned int, но принудительно приводится к типуsigned char или unsigned char, соответственно

указатель на signed char

формально существуют только в языке Си начиная со второго стандарта (1999)

h

Аргумент имеет тип int или unsigned int, но принудительно приводится к типуshort int или unsigned short int, соответственно

указатель на short int

ll

long long int или unsigned long long int

указатель на long long int

j

intmax_t или uintmax_t

указатель на intmax_t

z

size_t (или эквивалентный по размеру знаковый тип)

указатель на эквивалентный по размеру size_t знаковый тип

t

ptrdiff_t (или эквивалентный по размеру беззнаковый тип)

указатель на ptrdiff_t

L

__int64 или unsigned __int64

указатель на __int64

Для Borland Builder 6 (спецификатор llожи дает 32-бит число)

Спецификации h и hh используются для компенсации стандартных продвижений типов в сочетании с переходами от знаковых типов к беззнаковым или наоборот.

Например, рассмотрим реализацию Си, где тип char знаковый и имеет размер 8 бит, тип int имеет размер 32 бит, используется дополнительный способ кодирования отрицательных целых.

char c = 255;

printf("%X", c);

Такой вызов даст вывод FFFFFFFF, что, возможно, не то, чего ожидал программист. Действительно, значение c равно (char)(-1), а после продвижения типа оно оказывается равно -1. Применение формата %X вызывает интерпретацию данного значения как беззнакового, то есть, 0xFFFFFFFF.

char c = 255;

printf("%X", (unsigned char)c);

char c = 255;

printf("%hhX", c);

Эти два вызова имеют один и тот же эффект и дают вывод FF. Первый вариант позволяет избежать размножения знака при продвижении типа, второй — компенсирует его уже «внутри» функции printf.

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

%a, %A, %e, %E, %f, %F, %g, %G

отсутствует

double

L

long double

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

%c

%s

отсутствует

Аргумент имеет тип int или unsigned int, но принудительно приводится к типу char

char*

l

Аргумент имеет тип wint_t, но принудительно приводится к типу wchar_t

wchar_t*

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]