Ваше Имя:
Пароль:

+ Регистрация




printf()
Категория: C, Функции, Ввода/Вывода | Добавил: root, 2 июня 2006 | Просмотров: 29393
#include <stdio.h>
int printf(const char *format, ...);

Функция printf() записывает в стандартный поток stdout значения аргументов из заданного списка аргументов в соответствии со строкой форматирования, адресуемой параметром format.

В версии С99 к параметру format применен квалификатор restrict.

Строка форматирования состоит из элементов двух типов. К элементам первого типа относятся символы, которые выводятся на экран. Элементы второго типа содержат спецификации формата, определяющие способ отображения аргументов. Спецификация формата начинается символом процента, за которым следует код формата. Количество аргументов должно в точности совпадать с количеством спецификации формата, причем соответствие устанавливается в порядке их следования. Например, при вызове следующей функции printf О на экране будет отображено "Hi с 10 there!".
printf("Hi %с %d %s", 'c', 10, "there!");

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

Функция printf() возвращает число реально выведенных символов. Если функция возвратит отрицательное значение, то это будет свидетельствовать о наличии ошибки.

На спецификации формата могут воздействовать модификаторы, задающие ширину поля, точность и признак выравнивания по левому краю. Целое значение, расположенное между знаком % и командой форматирования, играет роль спецификации минимальной ширины поля. Наличие этого спецификатора приводит к тому, что результат будет заполнен пробелами или нулями, чтобы выводимое значение занимало поле, ширина которого не меньше заданной минимальной ширины. Если длина выводимого значения (строки или числа) больше этого минимума, оно будет выведено полностью несмотря на превышение минимума. По умолчанию в качестве заполнителя используется пробел. Для заполнения нулями перед спецификацией ширины поля нужно поместить 0. Например, спецификация формата %05d дополнит нулями выводимое число, в котором менее пяти цифр, чтобы общая длина равнялась 5 символам.

Действие модификатора точности зависит от кода формата, к которому он применяется. Чтобы добавить модификатор точности, поставьте за спецификацией ширины поля десятичную точку, а после нее — требуемое значение точности. Для форматов а, А, е, E, f и F модификатор точности определяет число выводимых десятичных знаков. Например, спецификация формата %l0.4f обеспечит вывод числа с четырьмя знаками после запятой в поле шириной не меньше десяти символов. Если модификатор точности применяется к коду формата g или G, то он определяет максимальное число выводимых значащих цифр. Применительно к целым, модификатор точности задает минимальное количество выводимых цифр. При необходимости перед числом будут добавлены нули.

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

По умолчанию все выводимые значения выравниваются по правому краю: если ширина поля больше выводимого значения, оно будет выровнено по правому краю поля. Чтобы установить выравнивание по левому краю, нужно поставить знак "минус" сразу после знака %. Например, спецификация формата %-10.2f обеспечит выравнивание вешественного числа с двумя десятичными знаками в 10-символьном поле по левому краю.

Существуют два модификатора формата, позволяющие функции printf() отображать короткие и длинные целые. Эти модификаторы могут применяться к спецификаторам типа d, i, o, u, х и X. Модификатор l уведомляет функцию printf() о длинном типе значения. Например, спецификация %ld означает, что выводится длинное целое число. Модификатор h сообшает функции printf(), что нужно вывести число короткого целого типа. Следовательно, строка %hu означает, что выводимое данное имеет тип short unsigned int.

Код и Формат:
Выводит шестнадцатеричное число в форме Qxh.hhhhp+d (только С99)
Выводит шестнадцатеричное число в форме QXh hhhhP+d (только С99)
Символ
%d Десятичное целое число со знаком
%i Десятичное целое число со знаком
Экспоненциальное представление числа (в виде мантиссы и порядка) (е на нижнем регистре)
Экспоненциальное представление числа (в виде мантиссы и порядка) (Е на верхнем регистре]
%f Десятичное число с плавающей точкой
%F Десятичное число с плавающей точкой (только С99; если применяется к бесконечности или к нечисловому значению, то выдает надписи INF, INFINITY или NAN на верхнем регистре. Спецификатор %f выводит их эквиваленты на нижнем регистре.)
%g Использует более короткий из форматов или %f
%G Использует более короткий из форматов или %F
%o Восьмеричное число без знака
%s Символьная строка
%u Десятичное целое число без знака
Шестнадцатеричное без знака (строчные буквы)
Шестнадцатеричное без знака (прописные буквы)
Выводит указатель
%n Соответствующий аргумент должен быть указателем на целое число. (Этот спецификатор указывает, что в целочисленной переменной, на которую указывает ассоциированный с данным спецификатором указатель, будет храниться число символов, выведенных к моменту обработки спецификации %n.)
%% Выводит знак процента

При использовании современного компилятора, поддерживаюшего добавленные в 1995 году средства работы с двухбайтовыми символами, можно к спецификации с применить модификатор l, чтобы указать на использование двухбайтовых символов. Модификатор 1 можно также использовать с командой формата s для вывода строки двухбайтовых символов.
Кроме того, модификатор l можно поставить перед командами форматирования вещественных чисел а, А, е, Е, f, F, g и G. В этом случае он уведомит о выводе значения типа long double.

Команда n сохраняет в целой переменной, указатель на которую задан в списке аргументов, число символов, которые были записаны в поток вывода к моменту обнаружения спецификатора n. Например, следующий фрагмент профаммы после строки "Это тест" выведет число 8.
int i;
printf("Это тест%n", &i);
printf("%d", i);

Чтобы обозначить, что соответствующий аргумент указывает на длинное целое, к спецификации n можно применить модификатор l. Для указания на короткое целое примените к спецификации n модификатор h.

Символ # при использовании с некоторыми кодами формата функции printf() приобретает специальное значение. Поставленный перед кодами a, A, g, G, f, e и Е, он гарантирует наличие десятичной точки даже в случае отсутствия десятичных цифр. Если поставить символ # перед кодами формата х и X, то шестнадцатеричное число будет выведено с префиксом Ох. Если же его поставить перед кодами формата о и 0, то восьмеричное число будет выведено с префиксом 0. Символ # нельзя применять ни к каким другим спецификациям формата.

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

Модификаторы формата функции printf(), добавленные стандартом С99


В версии С99 для использования в функции printf() добавлены модификаторы формата hh, 11, j, z и t. Модификатор hh можно применять к спецификаторам преобразования d, i, о, u, х, X и n. Он означает, что соответствующий аргумент является значением типа signed char или unsigned char, а в случае спецификации n — указателем на переменную типа signed char. Модификатор ll также можно применять к спецификаторам преобразования d, i, о, u, х, X и n. Он означает, что соответствующий аргумент является значением типа signed long long int или unsigned long long int, а в случае спецификатора n — указателем на переменную типа long long int. Версия С99 также позволяет применять модификатор l к спецификаторам преобразования чисел с плавающей точкой а, А, е, Е, f, F, g и G, но это не дает никакого эффекта.

Применение модификатора формата j к спецификаторам преобразования d, i, о, u, х, X и n устанавливает для соответствующего аргумента тип intmax_t или uintmax_t. Эти типы объявлены в заголовке <stdint.h> и служат для хранения целых самой большой разрядности.

Применение к спецификаторам преобразования d, i, о, u, х, X и n модификатора формата z устанавливает для соответствующего аргумента тип size_t. Этот тип объявлен в заголовке <stddef.h> и служит для хранения результата выполнения оператора sizeof.
Применение к спецификаторам преобразования d, i, о, u, х, X и n модификатора формата t устанавливает для соответствующего аргумента тип ptrdiff__t. Этот тип объявлен в заголовке <stddef.h> и служит для хранения значения разности между двумя указателями.

Пример

Данная программа выводит то, что указано в комментариях.
#include <stdio.h>
int main(void)
{
/* Этот фрагмент печатает строку "это тест",
которая выравнивается по левому краю поля шириной в 20 символов. */

printf("%-20s", "это тест");
/* Этот фрагмент печатает в поле шириной в
10 символов число с плавающей точкой с тремя
десятичными разрядами после запятой.
В результате получится " 12.235". */

printf("%10.3f", 12.234657);

return 0;
}


Зависимые функции

scanf() и fprintf()



Версия для печати

Комментариев: 0 +
Уважаемый посетитель, вы вошли на сайт как незарегистрированный пользователь. Вы можите зарегистрироваться, либо войти на сайт под своим именем, чтобы добавлять комментарии.

Другие статьи в этой категории
#include <stdlib.h>
int wctomb(char *out, wchar_t in);
Функция wctomb() преобразует двухбайтовый символ, содержащийся в параметре in, в его многобайтовый эквивалент и помещает результат в массив, адресуемый параметром out. Массив, адресуемый параметром out, должен иметь длину не меньше MB_CUR_MAX символов.

При успешном выполнении функция wctomb() возвращает количество байтов, содержащихся в многобайтовом символе. При возникновении ошибки возвращается значение -1.

Если параметр out равен нулю, функция wctomb() возвращает ненулевое значение в случае, когда многобайтовый символ имеет кодировку, зависящую от территориально-языковых особенностей. В противном случае возвращается нуль.
#include <stdlib.h>
size_t wcstombs(char *out, const wchar_t *in, size_t size);

Функция wcstombs() преобразует массив двухбайтовых символов, адресуемый параметром-указателем in, в его многобайтовый эквивалент и помещает результат в массив, адресуемый параметром out. Преобразованию подлежат только первые size символов. Процесс преобразования прекращается раньше, если будет обнаружен символ конца строки ('0').

В версии С99 к параметрам out и in применен квалификатор restrict.

При успешном выполнении функция wcstombs() возвращает количество байтов, помещенных в массив out. При возникновении ошибки возвращается значение -1.
#include <stdarg.h>
type va_arg(va_list argptr, type);
void va_copy(va_list target, va_list source);
void va_end(va_list argptr);
void va_start(va_list argptr, last_parm);
Макрос va_copy() добавлен в версии С99.

Для передачи функции переменного числа аргументов совместно используются макросы va_arg, va_start и va_end. Самым распространенным примером функции, которая принимает переменное число аргументов, является функция printf(). Тип va_list определен в заголовке .

Общая процедура создания функции, которая может принимать переменное количество аргументов, такова:

Функция должна иметь по крайней мере один известный параметр (может и больше), указываемый до переменного списка параметров. (Такие параметры называются также обязательными, а параметры, следующие за ними — необязательными.) Крайний правый известный параметр называется last_parm. (Он предшествует первому необязательному параметру.) Его имя используется в качестве второго параметра в обращении к макросу va_start(). Чтобы получить доступ к любому дополнительному параметру, сначала необходимо инициализировать указатель-аргумент argptr, обратившись к макросу va_start(). (Иными словами, необходимо выполнить вызов va_start(argptr, <имя last_parm>).) После этого значения параметров возвращаются в результате вызова макроса va_arg(). В качестве второго аргумента этого макроса (соответствующего параметру type), нужно указать тип следующего параметра. Наконец, после прочтения всех параметров до возвращения из функции необходимо вызвать макрос va_end(), чтобы гарантировать корректное восстановление стека. Если макрос va_end() вызван не будет, высока вероятность аварийного отказа программы.

Макрос va_copy() копирует список аргументов, обозначенный параметром target, в объект, обозначенный параметром source.
#include <stdlib.h>
int system(const char *str);
Функция system() передает строку, адресуемую параметром str, в качестве команды для командного процессора операционной системы.

Если функция system() вызывается с нулевым указателем, она возвращает ненулевое значение при условии доступности командного процессора и нуль в противном случае. (Программы, выполняемые в специальных средах, могут не иметь доступа к командному процессору.) Значение, возвращаемое функцией system(), определяется конкретной реализацией. Но обычно возвращается нуль при успешном выполнении команды, а ненулевое значение кода возврата означает наличие ошибки.
#include <stdlib.h>
unsigned long long int strtoull(const char *restrict start,
char **restrict end, int radix);
Функция strtoull() добавлена в версии С99.

Функция strtoull() аналогична функции strtoul() за исключением того, что она возвращает значение типа unsigned long long int. Если результат не может быть представлен как значение типа unsigned long long int, возвращается значение ULLONG_MAX, а глобальная переменная errno устанавливается равной значению ERANGE, свидетельствующему об ошибке из-за выхода результата за пределы представимых чисел. Если параметр start не указывает на число, никакого преобразования не выполняется и функция возвращает нуль.
#include <stdlib.h>
unsigned long int strtoul(const char *start, char **end, int radix);
Функция strtoul() преобразует строковое представление числа, которое содержится в строке, адресуемой параметром start, в значение типа unsigned long и возвращает полученный результат. Основание системы счисления, в которой представлено число, определяется параметром radix. Если значение radix равно нулю, то основание определяется так же, как и основание системы счисления при записи констант. Если значение radix не равно нулю, то оно должно быть целым числом от 2 до 36.

В версии С99 к параметрам start и end применен квалификатор restrict.

Функция strtoul() работает следующим образом:

Сначала в строке, адресуемой параметром start, пропускаются пробелы, символы табуляции и пустой строки. Затем считывается число. Считывание заканчивается как только будет обнаружен символ, который не может быть частью длинного целого числа без знака. К таким символам относятся пробелы, символы табуляции и пустой строки, знаки препинания и другие символы. Наконец, параметр end устанавливается так, чтобы указывать на "неиспользованный" остаток исходной строки, если такой существует. Например, если функция strtoul() вызывается с аргументом

"100 клещей"
то она возвратит значение

100L
а параметр end будет указывать на пробел, предшествующий слову

"клещей"
Если результат не может быть представлен как длинное целое без знака, функция strtoul() возвращает значение ULONG_MAX, а глобальная переменная errno устанавливается равной значению ERANGE, что свидетельствует об ошибке из-за выхода результата за пределы представимых чисел. Если параметр start не указывает на число, никакого преобразования не выполняется и функция возвращает нуль.
#include <stdlib.h>
long long int strtoll(const char * restrict start, char ** restrict end, int radix);
Функция strtoll() добавлена в версии С99.

Функция strtoll() аналогична функции strtol() за исключением того, что она возвращает значение типа long long int. Если результат не может быть представлен как значение типа long long int, возвращается либо значение LLONG_MAX, либо значение LLONG_MIN, а глобальная переменная errno устанавливается равной значению ERANGE, свидетельствующему об ошибке из-за выхода результата за пределы представимых чисел. Если параметр start не указывает на число, никакого преобразования не выполняется и функция возвращает нуль.