Шаг 85.
Microsoft Visual C++ 2010. Язык С/С++. Ввод и вывод в языках C и C++. Ввод/вывод файлов в языке C. Функции стандартного ввода/вывода в языке C
На этом шаге мы рассмотрим функцию printf().
Одно из таких функций является функция printf(). Ее формат:
printf (Control, argl, arg2, ..., argn);
Функция форматного вывода. Выводит на экран содержимое
arg1,
arg2, ...,
argn и возвращает количество выводимых байтов.
Здесь Control - управляющая символьная строка, в которой находятся форматы вывода на экран для соответствующих аргументов arg1, arg2, ..., argn, т. е. первый
формат- для вывода arg1, второй - для arg2 и т. д.
Все символы, находящиеся между форматами, выводятся один к одному (т. е. не форматируются), что дает возможность вывода дополнительного текста для улучшения читаемости результата вывода.
Форматы вывода задаются так: любой формат начинается с символа % и заканчивается одним из символов форматирования:
- d - аргумент преобразуется к десятичному виду (с учетом знака);
- o - аргумент преобразуется к восьмеричному беззнаковому виду;
- х - аргумент преобразуется в беззнаковую шестнадцатеричную форму (с символами a, b, с, d, е, f);
- X - аргумент преобразуется в беззнаковую шестнадцатеричную форму (с символами А, В, С, D, E, F);
- U - аргумент преобразуется в беззнаковую десятичную форму;
- c - аргумент рассматривается как отдельный символ;
- s - аргумент рассматривается как строка символов; символы строки печатаются до тех пор, пока не будет достигнут нулевой символ или не будет напечатано количество символов,
указанное в спецификаторе точности (о спецификаторе точности скажем далее);
- е - аргумент рассматривается как переменная типа float или double и преобразуется в десятичную форму в экспоненциальном [-]m.nnnnnnе[+-]хх, где длина
строки из n определяется указанной точностью. По умолчанию точность равна 6;
- Е - то же, что и е, но с Е для экспоненты;
- f - аргумент рассматривается как переменная типа float или double и преобразуется в десятичную форму в виде [-]m.nnnnnn, где длина
строки из n определяется указанной точностью. По умолчанию точность равна 6;
- g - используется либо формат %е, либо %f: выберется тот формат, который даст изображение числа меньшим количеством знаков с учетом заданной точности.
Незначащие нули не печатаются;
- G - то же, что и g, но с Е для экспоненты, если используется формат е;
- n - указатель на целое со знаком;
- р - входной аргумент выводится как указатель. Формат зависит модели используемой памяти. Он может быть вида XXXX:YYYY или YYYY (только смещение).
Между границами формата вывода находятся:
[флажки] [ширина] [.точность] [F|N|h|l|L].
- квадратные скобки означают, что элемент, входящий в них, может отсутствовать для какого-то формата. Например, если выводится десятичное число, то точность для него не имеет смысла;
- флажки определяют выравнивание выводимого значения (по правому или по левому краю поля вывода), знаки числа, десятичные точки, конечные нули, восьмеричные и шестнадцатеричные префиксы. Флажки имеют следующий смысл:
- - (минус) - выравнивание результата по левому краю поля вывода (число будет прижато к левой границе поля вывода) и заполнение поля вывода справа пробелами. Если этот флаг не задан, то результат
выравнивается по правому краю поля вывода, а оставшееся слева пространство заполняется пробелами или нулями;
- + - преобразование результата к виду со знаком: результат всегда начинается со знака "+" или "-";
- пробел - если значение неотрицательное, то вместо плюса выводится пробел. Для отрицательных чисел выводится минус;
- # - указывает, что аргумент должен быть преобразован с использованием альтернативной формы. Это означает, что если флажок # используется вместе с символом преобразования (форматирования),
то при преобразовании аргумента для символов с, s, d, u, i, о, x, X символ # не влияет на результат. Для символов е, Е, f результат всегда будет содержать десятичную точку, даже
если за точкой не следует никаких цифр (обычно десятичная точка появляется, если за ней следует цифра). Для символов g, G результат будет как для символов е, Е, но с тем отличием, что хвостовые нули не будут удаляться.
Примечание. Если заданы и пробел, и знак "+", то преимущество имеет знак "+".
- спецификатор ширины определяет размер поля для выходного значения. Ширину можно задать двумя способами:
- напрямую - строкой десятичных цифр;
- косвенно - через символ * (в этом случае аргумент должен иметь тип int). Если для задания ширины используется символ * (звездочка), то спецификация ширины
указывается не в строке Control, а в списке аргументов перед соответствующим аргументом.
Спецификаторы ширины:
- n - в этом случае выведется не менее n символов. Если в выводимом числе символов меньше, чем n, то оставшаяся часть поля
заполнится пробелами справа (если задан флажок), и слева в противном случае;
- 0n (например, 04) - будет выведено не менее n символов. Если в выводимом числе символов меньше, чем n, то оставшаяся часть поля заполнится слева нулями;
- * (для формата d) - если для задания ширины используется символ "*", то спецификация ширины указывается не в строке Соntrol, а в списке аргументов перед
тем аргументом, для которого она определена. Причем ширина представляет собой отдельный аргумент. Например, выводим значение переменной i=2, используя printf ("%*d\n", 5, i);.
Результат будет пппп2 (где п - пробел). Здесь ширина задана равной 5 и указана в списке аргументов отдельно, но перед тем аргументом, для которого она определена;
- спецификатор точности задает число выводимых символов после точки (дробная часть числа). Задание спецификатора точности всегда начинается со знака точки (чтобы
отделить его от спецификатора ширины). Как и спецификатор ширины, точность может задаваться двумя способами:
- напрямую - заданием числа;
- косвенно - указанием символа *. Если вы используете * для спецификатора точности, то спецификация точности должна указываться не в строке Control, а в списке
аргументов перед соответствующим аргументом как отдельный аргумент (через запятую).
Примечание. Аргумент, для которого указывается спецификация точности, может быть только вещественного типа.
Например:
float nn = 12.567;
printf ("%.*f\n", 2, nn); //вывести 2 знака после точки
Результат: 12.57.
- модификаторы размера, задаваемые в формате, определяют, как функция интерпретирует аргумент. Действие модификаторов показано в таблице 1.
Таблица 1. Действие модификаторов размера
Значение |
Формат |
Интерпретация |
h |
d, o, u, x, X |
short int |
l |
d, o, u, x, X |
long int |
l |
e, E, f, g, G |
double |
L |
e, E, f, g, G |
long double |
L |
d, o, u, x, X |
__int64 |
h |
с, С |
1 символьный байт |
l |
с, С |
2 символьных байта |
h |
s, S |
1 строка символов по 1 байту на символ |
l |
s, S |
1 строка символов по 2 байта на символ |
Например, если мы выводим данные типа long, то должны задавать вместе с форматом d и модификатор типа l, т. е общий вид формата будет ld.
На следующем шаге мы закончим изучение этого вопроса.
Предыдущий шаг
Содержание
Следующий шаг