Разделы сайта:
Статьи по C и C++Стандартная библиотека CКнигиЮмор
Форматированный ввод-вывод

Часть 1. Спецификаторы ввода-вывода

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

Системные символы (эскейп-последовательности)

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

Комбинация Результат
\n Символ переход на новую строку
\r Символ перевода каретки
\t Табуляция горизонтальная
\v Табуляция вертикальная
\f Переход на следующую логическую страницу
\a Сигнал пользователю. Он может выражаться как в виде звука, так и визуальным путем.
\\ Обратный слеш
\' Одинарная кавычка
\" Двойная кавычка
\? Вопросительный знак
\x... Символ с номером ..., записанным в шестнадцатиричном формате
\... Символ с номером ..., записанным в восьмеричном формате

Спецификаторы формата функций вывода

Когда функция форматированного ввода или вывода печатает строку, она не может знать, в каком порядке ей переданы аргументы (особенности va_list и структуры памяти x86-компьютеров), для этого программист включает в строку так называемые спецификаторы формата, которые говорят функции что выводить и как. Они начинаются с символа процент (%).

%[флаги][ширина][.точность][F|N|h|hh|l|ll|L|I|t|j|z|I64|I32|w]тип

Флаги могут записываться в любой последовательности и в любой комбинации. Если вы выберете флаг минус (-), то установите выравнивание влево в отведенном с помощью параметра "ширина" поле, если же нет, все выводимые данные будут выравниваться вправо. Заполнение происходит либо нулями, либо пробелами. Флаг + обязует функцию форматированного вывод вывести знак числа, если же совместно с этим флагом задан флаг "пробел", то последний флаг будет игнорироваться. Флаг "пробел" означает, что если выводится положительное число, вместо знака ничего не выводится: ставится пробел, если же отрицательное, то ставится знак минус. Флаг "решетка" (#) неодинаков для всех типов.

Спецификатор ширины применяется для ограничения размеров выводимого поля. Если Вы укажете число в качестве параметра, то будет выводится по крайтей мере количество символов, данное числу, а оставшиеся заполнятся пробелами. Если перед числом указать нуль ("0"), то оставшиеся позиции будут заполняться нулями. Если указать параметр "*", то шириной поля будет являться число, равное значению следующему аргументу из списка, при этом аргумент должен быть целого типа и будет игнорироваться при печати. То есть в следующем коде:

int symbolCount=0;
int uID = 7581125;
int uID2 = 5862458;
scanf("%i\n",&symbolCount);
printf("%*i\n%16i",uID, symbolCount&0xF, uID2);
число uID будет выведено в поле шириной, указаннной в symbolCount, а uID2 будет иметь посто- янную ширины в 16 символов.

С помощью параметра точности можно задать усечение количества символов и изменение позиции десятичной точки.

Если Вы указываете параметры целого типа, вы не можете указать, какой конкретно тип выводится (длинный, короткий), если непосредственно перед типом не указать одну из следующих букв

Символ Результат
N* Ближний указатель
F* Дальний указатель
h short int (signed или unsigned)
hh** char (signed или unsigned)
l long (signed или unsigned)
ll** long long (signed или unsigned)
j** intmax_t, uintmax_t
z** size_t
t** ptrdiff_t
L long double
w*** wchar_t вместо char
I32*** __int32
I64*** __int64
I*** ptrdiff_t, size_t
* Только компиляторы Borland
** Только ISO/IEC 9899:1999 (C99)
*** Только компиляторы Microsoft

И наконец, список основных спецификаторов.

Символ Аргумент
dЦелыйцелый десятичный
iЦелыйцелый десятичный
OЦелыйцелый восьмеричный
uЦелыйцелый десятичный беззнаковый
xЦелыйцелый шестнадцатиричный с цифрами в нижнем регистре
XЦелыйцелый шестнадцатиричный с цифрами в верхнем регистре
fДробныйдействительный с фиксированной точкой (точностью можно указать ее позицию)
a*Дробныйдействительный шестнадцатиричный с фиксированной точкой с цифрами в нижнем регистре
A*Дробныйдействительный шестнадцатиричный с фиксированной точкой с цифрами в верхнем регистре
eДробныйдействительный экспонентациальный: выводятся мантисса и экспонента, разделяемые символом e
EДробный действительный экспонентациальный: выводятся мантисса и экспонента, разделяемые символом E
gДробныйдействительный экспонентациальный компактный с символом e
GДробныйдействительный экспонентациальный компактный с символом E
cСимволсимвол
sСтрокастрока
nУказатель на int в ячейку памяти, на которую ссылается аргумент, записывается количество символов, которые функция уже напечатала
pУказатель на void выводится значение указателя (сегмент:область)
* Только ISO/IEC 9899:1999 (C99)

При вводе возможностей гораздо меньше. Из параметров предусмотрена только ширина, флаг "*" (он обозначает следующее: аргумент считывается, но в память не заносится). Конкретизация типов ограничена h, l, I64, L в компиляторах Microsoft и F, N, h, l, L в компиляторах Borland.

Примечание: если Вы не уверены в том, что компилятор поддерживает одну из приведенных выше возможностей, обратитесь к помощи за более подробной информацией. Также следует обратиться к стандартам С.

Дальше
Автор и разработчик сайта - Кляус Сергей. Спасибо Форуму на Исходниках.RU за помощь в сборе материалов.
X