sprintf — Возвращает отформатированную строку


Содержание

sprintf()

Синтаксис:

sprintf (format, arg1[, arg2[, arg++]])

Поддерживается следующими версиями PHP:

Описание функции:

Функции sprintf() возвращает отформатированную строку.

Отличие от функции printf() состоит в возращаемых данных, printf() возвращает длину строки.

Обязательный аргумент. Аргумент содержит строку и указания на формат переменных.

Возможные значения форматирования:

%% — Знак %
%b — трактуется как целое и выводится в виде двоичного числа
%c — трактуется как целое и выводится в виде символа с соответствующим кодом ASCII
%d — трактуется как целое и выводится в виде десятичного числа со знаком.
%e — трактуется как float и выводится в научной нотации (например 2.4e+3).
%E — аналогично %e, только выводит большую букву E (например 2.4E+3).
%u — трактуется как целое и выводится в виде десятичного числа без знака.
%f — трактуется как float и выводится в виде десятичного числа с плавающей точкой. (локальные настройки).
%F — трактуется как float и выводится в виде десятичного числа с плавающей точкой. (не локальные настройки).
%g — выводится то, что короче %e или %f .
%G — выводится то, что короче %E или %f .
%o — трактуется как целое и выводится в виде восьмеричного числа.
%s — трактуется как строка.
%x — трактуется как целое и выводится в виде шестнадцатеричного числа (в нижнем регистре букв).
%X — трактуется как целое и выводится в виде шестнадцатеричного числа (в верхнем регистре букв).

Дополнительные значения форматирования:

  • + (ставит знак «+» или «-» перед числами, по умолчанию ставится только перед отрицательными числами)
  • * ( символ используемый для заполнения результата до нужной длины.)
  • — (выравниватель влево, по умолчанию вправо)
  • [0-9] (минимальное число символов)
  • .[0-9] (описатель точности для чисел с плавающей точкой)

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

arg1 Обязательный аргумент. Аргумент который должен быть вставлен в первую %знак конструкцию в аргументе format. mixed arg2, arg++ Необязательный аргумент. Аргумент который должен быть вставлен во вторую, третью и т.д %знак конструкцию в аргументе format. mixed

Примеры:

Пример 1:

$model = ‘жигули’;
$year = 1975;
$format = ‘Это %s %d года’;
$a = sprintf($format, $model, $year);
echo $a;
?>

Это жигули 1975 года

Пример 2:

$ar = 7545;
$format = ‘%g’;
$a =sprintf($format, $ar);
echo $a;
echo «
«;
$ar = 754576868;
$b =sprintf($format, $ar);
echo $b;
?>

Пример 3:

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

$ar = 7545.4545;
$format = ‘%+0+9.2f’;
$a = sprintf($format, $ar);
echo $a;
echo ‘
‘;
$format = ‘%+0-9.2f’;
$b = sprintf($format, $ar);
echo $b;
?>

Пример 4:

Для изменение порядка следования параметров используется n\$

$model = ‘жигули’;
$year = 1975;
$format = «Это %2\$d года %1\$s «;
$a = sprintf($format, $model, $year);
echo $a;
?>

Sprintf — Возвращает отформатированную строку

sprintf — возвращает отформатированную строку.

Описание

string sprintf (string format [, mixed args])

Возвращает строку, созданную в соответствии со строкой форматирования format .

Строка форматирования состоит из 0 или более директив: обычных символов (исключая % ), которые копируются прямо в результат, и спецификаций конвертации, каждая из которых приводит к извлечению её собственного параметра. Это применяется к sprintf() и к printf() .

Каждая спецификация конвертации состоит из знака процентов ( % ) с последующим одним или более из следующих элементов, в данном порядке:


Необязательный padding-спецификатор , который сообщает, какой символ будет использоваться для заполнения результатов до размера строки. Это может быть символ space/пробел или 0 (символ нуль). По умолчанию заполняется пробелами. Альтернативный заполнитель может быть специфицирован с помощью префикса — одинарной кавычки ( ‘ ). См. примеры далее.

Необязательный alignment-спецификатор , который сообщает, должен ли результат выравниваться влево или вправо (left-justified или right-justified). По умолчанию right-justified; символ — здесь делает left-justified.

Необязательное число, width-спецификатор , который сообщает, сколько символов (минимум) должна дать эта конвертация.

Необязательный precision-спецификатор , который сообщает, сколько десятеричных цифр должно выводиться для чисел с плавающей точкой. Эта опция не оказывает действия на другие типы, кроме float . (Для форматирования чисел используется также функция number_format() .)

type-спецификатор , который сообщает, как какой тип должны рассматриваться данные аргумента. Возможные типы:

% — литеральный символ процентов. Аргументы не требуются.
b — аргумент рассматривается как integer и представлен как двоичное число.
c — аргумент рассматривается как integer и представлен как символ с этим ASCII-значением.
d — аргумент рассматривается как integer и представлен как (знаковое) десятеричное число.
u — аргумент рассматривается как integer и представлен как беззнаковое десятеричное число.
f — аргумент рассматривается как float и представлен как число с плавающей точкой.
o — аргумент рассматривается как integer и представлен как восьмеричное число.
s — аргумент рассматривается и представляется как строка/string.
x — аргумент рассматривается как integer и представлен как шестнадцатеричное число (с буквами в нижнем регистре).
X — аргумент рассматривается как integer и представлен как шестнадцатеричное число (с буквами в верхнем регистре).

Как и в PHP версии 4.0.6, строка форматирования поддерживает нумерацию/обмен аргументов (numbering/swapping). Вот пример:

Пример 1. Обмен/swapping аргументов

Это выведет «There are 5 monkeys in the tree». Но представьте, что мы создаём строку форматирования в отдельном файле, что является обычным, поскольку мы хоти интернационализировать её, и мы переписываем:

Пример 2. Обмен аргументов

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

Пример 3. Обмен аргументов

Теперь появилось преимущество: вы можете повторять заглушки без добавления аргументов в коде. Например:

printf()

Вот прототип функции printf() :

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

Управляющая_строка [1] состоит из элементов двух видов. Первый из них — это символы, которые предстоит вывести на экран; второй — это спецификаторы преобразования [2] , которые определяют способ вывода стоящих за ними аргументов. Каждый такой спецификатор начинается со знака процента, за которым следует код формата. Аргументов должно быть ровно столько, сколько и спецификаторов, причем спецификаторы преобразования и аргументы должны попарно соответствовать друг другу в направлении слева направо. Например, в результате такого вызова printf()

В этом примере первому спецификатору преобразования ( %c ), соответствует символ ‘C’, а второму ( %s ), — строка «и к тому же очень сильно!».

В функции printf() , как видно из табл. 8.2, имеется широкий набор спецификаторов преобразования.

Таблица 8.2. Спецификаторы преобразования для функции printf()
Код Формат
%a Шестнадцатеричное в виде 0xh.hhhhp+d (только С99)
%A Шестнадцатеричное в виде 0Xh.hhhhP+d (только С99)
%c Символ
%d Десятичное целое со знаком
%i Десятичное целое со знаком
%e Экспоненциальное представление (‘е’ на нижнем регистре)
%E Экспоненциальное представление (‘Е’ на верхнем регистре)
%f Десятичное с плавающей точкой
%g В зависимости от того, какой вывод будет короче, используется %е или %f
%G В зависимости от того, какой вывод будет короче, используется %Е или %F
%o Восьмеричное без знака
%s Строка символов
%u Десятичное целое без знака
%x Шестнадцатеричное без знака (буквы на нижнем регистре)
%X Шестнадцатеричное без знака (буквы на верхнем регистре)
%p Выводит указатель
%n Аргумент, соответствующий этому спецификатору, должен быть указателем на целочисленную переменную. Спецификатор позволяет сохранить в этой переменной количество записанных символов (записанных до того места, в котором находится код %n )
%% Выводит знак %

Вывод символов

Для вывода отдельного символа используйте %с . В результате соответствующий аргумент будет выведен на экран без изменения.

Для вывода строки используйте %s .

Вывод чисел

Числа в десятичном формате со знаком отображаются с помощью спецификатора преобразования %d или %i . Эти спецификаторы преобразования эквивалентны; оба поддерживаются в силу сложившихся привычек программистов, например, из-за желания поддерживать те же спецификаторы, которые применяются в функции scanf() .

Для вывода целого значения без знака используйте %u .

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

Спецификаторы преобразования %e и %E в функции printf() позволяют отображать аргумент типа double в экспоненциальном формате. В общем виде числа в таком формате выглядят следующим образом:

Чтобы отобразить букву E в верхнем регистре, используйте спецификатор преобразования %E ; в противном случае используйте спецификатор преобразования %e .

Спецификатор преобразования %g или %G указывает, что функции printf() необходимо выбрать один из спецификаторов: %f или %e . В результате printf() выберет тот спецификатор преобразования, который позволяет сделать самый короткий вывод. Если нужно, чтобы при выборе экспоненциального формата буква E отображалась на верхнем регистре, используйте спецификатор преобразования %G ; в противном случае используйте спецификатор преобразования %g .

Применение спецификатора преобразования %g показано в следующей программе:

В результате выполнения получится следующее:

Целые числа без знака можно выводить в восьмеричном или шестнадцатеричном формате, используя спецификатор преобразования %o или %x . Так как в шестнадцатеричной системе для представления чисел от 10 до 15 используются буквы от А до F, то эти буквы можно выводить на верхнем или на нижнем регистре. Как показано ниже, в первом случае используется спецификатор преобразования %X , а во втором — спецификатор преобразования %x :

Вот что вывела эта программа:

Отображение адреса

Для отображения адреса используйте спецификатор преобразования %p . Этот спецификатор преобразования дает printf() указание отобразить машинный адрес в формате, совместимом с адресацией, которая используется компьютером. Следующая программа отображает адрес переменной sample :

Спецификатор преобразования %n

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

Программа отображает строку Это проверка , после которой появляется число 3 . Спецификатор преобразования %n в основном используется в программе для выполнения динамического форматирования.

Модификаторы формата

Во многих спецификаторах преобразования можно указать модификаторы [3] , которые слегка меняют их значение. Например, можно указывать минимальную ширину поля, количество десятичных разрядов и выравнивание по левому краю. Модификатор формата помещают между знаком процента и кодом формата. Об этих модификаторах сейчас и пойдет речь.

Модификаторы минимальной ширины поля

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

Вот что выводится при выполнении этой программы:

Модификатор минимальной ширины поля чаще всего используется при создании таблиц, в которых столбцы должны быть выровнены по вертикали. Например, следующая программа выводит таблицу квадратов и кубов чисел от 1 до 19: А вот пример полученного с ее помошью вывода:

Модификаторы точности

Модификатор точности следует за модификатором минимальной ширины поля (если таковой имеется). Он состоит из точки и расположенного за ней целого числа. Значение этого модификатора зависит от типа данных, к которым его применяют.

Когда модификатор точности применяется к данным с плавающей точкой, для преобразования которых используются спецификаторы преобразования %f , %e или %E , то он определяет количество выводимых десятичных разрядов. Например, %10.4f означает, что ширина поля вывода будет не менее 10 символов, причем для десятичных разрядов будет отведено четыре позиции.

Если модификатор точности применяется к %g или %G , то он определяет количество значащих цифр.

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

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

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

Вот что выводится при выполнении этой программы:

Выравнивание вывода

По умолчанию весь вывод выравнивается по правому краю. То есть если ширина поля больше ширины выводимых данных, то эти данные располагаются по правому краю поля. Вывод по левому краю можно назначить принудительно, поместив знак минус прямо за % . Например, %-l0.2f означает, что число с плавающей точкой и с двумя десятичными разрядами будет выровнено по левому краю 10-символьного поля.

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

И вот что получилось:

Обработка данных других типов

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

Модификаторы l и h можно также применить к спецификатору n . Это делается с той целью, чтобы показать — соответствующий аргумент является указателем соответственно на длинное ( long ) или короткое ( short ) целое.

Если компилятор поддерживает обработку символов в расширенном 16-битном алфавите, добавленную Поправкой 1 от 1995 года (1995 Amendment 1), то для указания символа в расширенном 16-битном алфавите вы можете применять модификатор 1 для спецификатора преобразования c . Кроме того, для указания строки из символов в расширенном 16-битном алфавите можно применять модификатор 1 для спецификатора преобразования s .

Модификатор L может находиться перед спецификаторами преобразования с плавающей точкой e , f и g , и указывать этим, что преобразуется значение long double .

В Стандарте С99 вводится два новых модификатора формата: hh и ll . Модификатор hh можно применять для спецификаторов преобразования d , i , o , u , x или n . Он показывает, что соответствующий аргумент является значением signed или unsigned char или, в случае n , указателем на переменную signed char . Модификатор ll также можно применять для спецификаторов преобразования d , i , o , u , x или n . Он показывает, что соответствующий аргумент является значением signed или unsigned long long int или, в случае n , указателем на long long int . В С99 также разрешается применять l для спецификаторов преобразования с плавающей точкой a , е , f и g ; впрочем, это не дает никакого результата.

На заметку В составе С99 имеются некоторые дополнительные модификаторы типа для функции printf() ; о них рассказывается в части II.

Модификатор * и #

Для некоторых из своих спецификаторов преобразования функция printf() поддерживает два дополнительных модификатора: * и # .

Непосредственное расположение # перед спецификаторами преобразования g , G , f , Е или e означает, что при выводе обязательно появится десятичная точка — даже если десятичных цифр нет. Если вы поставите # непосредственно перед x или X , то шестнадцатеричное число будет выведено с префиксом 0x . Если # будет непосредственно предшествовать спецификатору преобразования o , число будет выведено с ведущим нулем. К любым другим спецификаторам преобразования модификатор # применять нельзя. (В С99 модификатор # можно применять по отношению к преобразованию %а ; это значит, что обязательно будет выведена десятичная точка.)

Модификаторы минимальной ширины поля и точности можно передавать функции printf() не как константы, а как аргументы. Для этого в качестве заполнителя используйте звездочку ( * ). При сканировании строки формата функция printf() будет каждой звездочке * из этой строки ставить в соответствие очередной аргумент, причем в том порядке, в каком расположены аргументы. Например, при выполнении оператора, показанного на рис. 8.1, минимальная ширина поля будет равна 10 символам, точность — 4, а отображаться будет число 123.3 .

В следующей программе показано применение обоих модификаторов # и * :

Рис. 8.1. Обратите внимание на то, каким образом звездочке (*) ставится в соответствие определенное значение

[1] Часто называется просто форматной строкой , форматным стрингом или форматом .

[2] Называются также спецификациями формата .

[3] Называются также спецификаторами .

sprintf

sprintf — возвращает отформатированную строку.

Описание

string sprintf (string format [, mixed args])

Возвращает строку, созданную в соответствии со строкой форматирования format.

Строка форматирования состоит из 0 или более директив: обычных символов (исключая %), которые копируются прямо в результат, и спецификаций конвертации, каждая из которых приводит к извлечению её собственного параметра. Это применяется к sprintf() и к printf().

Каждая спецификация конвертации состоит из знака процентов (%) с последующим одним или более из следующих элементов, в данном порядке:

Необязательный padding-спецификатор, который сообщает, какой символ будет использоваться для заполнения результатов до размера строки. Это может быть символ space/пробел или (символ нуль). По умолчанию заполняется пробелами. Альтернативный заполнитель может быть специфицирован с помощью префикса — одинарной кавычки ('). См. примеры далее.

Необязательный alignment-спецификатор, который сообщает, должен ли результат выравниваться влево или вправо (left-justified или right-justified). По умолчанию right-justified; символ - здесь делает left-justified.

Необязательное число, width-спецификатор, который сообщает, сколько символов (минимум) должна дать эта конвертация.

Необязательный precision-спецификатор, который сообщает, сколько десятеричных цифр должно выводиться для чисел с плавающей точкой. Эта опция не оказывает действия на другие типы, кроме float. (Для форматирования чисел используется также функция number_format().)

type-спецификатор, который сообщает, как какой тип должны рассматриваться данные аргумента. Возможные типы:

% — литеральный символ процентов. Аргументы не требуются.
b — аргумент рассматривается как integer и представлен как двоичное число.
c — аргумент рассматривается как integer и представлен как символ с этим ASCII-значением.
d — аргумент рассматривается как integer и представлен как (знаковое) десятеричное число.
u — аргумент рассматривается как integer и представлен как беззнаковое десятеричное число.
f — аргумент рассматривается как floatи представлен как число с плавающей точкой.
o — аргумент рассматривается как integer и представлен как восьмеричное число.
s — аргумент рассматривается и представляется как строка/string.
x — аргумент рассматривается как integer и представлен как шестнадцатеричное число (с буквами в нижнем регистре).
X — аргумент рассматривается как integer и представлен как шестнадцатеричное число (с буквами в верхнем регистре).

Как и в PHP версии 4.0.6, строка форматирования поддерживает нумерацию/обмен аргументов (numbering/swapping). Вот пример:

Пример 1. Обмен/swapping аргументов

Это выведет «There are 5 monkeys in the tree». Но представьте, что мы создаём строку форматирования в отдельном файле, что является обычным, поскольку мы хоти интернационализировать её, и мы переписываем:

Пример 2. Обмен аргументов

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

Пример 3. Обмен аргументов

Теперь появилось преимущество: вы можете повторять заглушки без добавления аргументов в коде. Например:

Php форматирование строк. Sprintf — Возвращает отформатированную строку

(PHP 4, PHP 5, PHP 7)

sprintf — Возвращает отформатированную строку

Список параметров

Строка формата состоит из нуля и более директив: обычных символов (за исключением % ), которые копируются напрямую в результирующую строку, и описателей преобразований , каждый из которых заменяется на один из параметров. Это относится как к sprintf() , так и к printf() .

Каждый описатель преобразований состоит из знака процента (% ), за которым следует один или более дополнительных элементов (в том порядке, в котором они здесь перечислены):

  1. Необязательный описатель знака , указывающий как знак (- или +) будет применен к числу. По умолчанию, используется только знак минус, если число отрицательное. Этот описатель заставляет положительные числа также отображать знак плюс, он был добавлен в PHP 4.3.0.
  2. Необязательный описатель заполнения , который определяет, какой символ будет использоваться для дополнения результата до необходимой длины. Это может быть пробел или . По умолчанию используется пробел. Альтернативный символ может быть указан с помощью одиночной кавычки (« ). См. примеры ниже.
  3. Необязательный описатель выравнивания , определяющий выравнивание влево или вправо. По умолчанию выравнивается вправо, используется для выравнивания влево.
  4. Необязательное число, описатель ширины , определяющий минимальное число символов, которое будет содержать результат этого преобразования.
  5. Необязательный описатель точности , указанный в виде точки («.»), после которой следует необязательная строка из десятичных чисел, определяющая, сколько десятичных разрядов отображать для чисел с плавающей точкой. При использовании со строками этот описатель выступает в роли обрезающей точки, устанавливающей максимальный лимит символов. Также между точкой и цифрой можно указать символ, используемый при дополнении числа.

Описатель типа , определяющий, как трактовать тип данных аргумента. Допустимые типы:

  • % — символ процента. Аргумент не используется.
  • b — аргумент трактуется как целое и выводится в виде двоичного числа.
  • c — аргумент трактуется как целое и выводится в виде символа с соответствующим кодом ASCII.
  • d — аргумент трактуется как целое и выводится в виде десятичного числа со знаком.
  • e — аргумент трактуется как число в в научной нотации (например, 1.2e+2). Описатель точности указывает на количество знаков после запятой, начиная с версии PHP 5.2.1. В более ранних версиях он обозначал количество значащих цифр (на один знак меньше).
  • E — аналогично %e , но использует заглавную букву (например, 1.2E+2).
  • f — аргумент трактуется как число с плавающей точкой и также выводится в зависимости от локали.
  • F — аргумент трактуется как число с плавающей точкой и также выводится, но без зависимости от локали. Доступно, начиная с версии PHP 4.3.10 и PHP 5.0.3.
  • g%e и %f .
  • G — выбирает самую краткую запись из %E и %f .
  • o — аргумент трактуется как целое и выводится в виде восьмеричного числа.
  • s — аргумент трактуется как строка.
  • u — аргумент трактуется как целое и выводится в виде десятичного числа без знака.
  • x — аргумент трактуется как целое и выводится в виде шестнадцатеричного числа (в нижнем регистре).
  • X — аргумент трактуется как целое и выводится в виде шестнадцатеричного числа (в верхнем регистре).

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

Обработка типов

Тип Спецификатор
string s
integer d , u , c , o , x , X , b
double g , G , e , E , f , F

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

В строке формата поддерживается нумерация и изменение порядка параметров. Например:

Пример #1 Изменение порядка параметров

«%d обезьян сидят на %s» ;

Этот код выведет «5 обезьян сидят на дереве». Теперь представьте, что строка формата содержится в отдельном файле, который потом будет переведен на другой язык, и мы переписываем ее в таком виде:

Пример #2 Изменение порядка параметров

«На %s сидят %d обезьян» ;
echo sprintf ($format , $num , $location );
?>

Появляется проблема: порядок описателей преобразования не соответствует порядку аргументов. Мы не хотим менять код, и нам нужно указать, какому аргументу соответствует тот или иной описатель преобразования.

Пример #3 Изменение порядка параметров

«На %2$s сидят %1$d обезьян» ;
echo sprintf ($format , $num , $location );
?>

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

Пример #4 Изменение порядка параметров

«На %2$s сидят %1$d обезьян.
Как здорово, когда на %2$s сидят %1$d обезьян.» ;
echo sprintf ($format , $num , $location );
?>


При изменении порядка параметров описатель позиции n$ должен идти сразу за знаком процента (% ) прежде всех остальных описателей, как показано в примере ниже.

Пример #5 Указание дополняющего символа

Пример #6 Использование описателя позиции и совместно с другими описателями

«На %2$s сидят %1$04d обезьян» ;
echo sprintf ($format , $num , $location );
?>

Результат выполнения данного примера:

На дереве сидят 0005 обезьян

Попытка использовать спецификатор позиции, больший чем PHP_INT_MAX , приведет к генерации предупреждения функцией sprintf() .

The c type specifier ignores padding and width

Возвращаемые значения

Возвращает строку, отформатированную в соответствии со строкой format .

Примеры

Пример #7 sprintf() : заполнение нулями

// двоичное представление
printf («%%c = «%c»\n» , $c ); // выводит символ ascii, аналогично функции chr()
printf («%%d = «%d»\n» , $n ); // обычное целое число
printf («%%e = «%e»\n» , $n ); // научная нотация
printf («%%u = «%u»\n» , $n ); // беззнаковое целое представление положительного числа
printf («%%u = «%u»\n» , $u ); // беззнаковое целое представление отрицательного числа
printf («%%f = «%f»\n» , $n ); // представление числа с плавающей точкой
printf («%%o = «%o»\n» , $n ); // восьмеричное представление
printf («%%s = «%s»\n» , $n ); // строка
printf («%%x = «%x»\n» , $n ); // шестнадцатеричное представление (нижний регистр)
printf («%%X = «%X»\n» , $n ); // шестнадцатеричное представление (верхний регистр)

Printf («%%+d = «%+d»\n» , $n ); // описатель знака с положительным целым числом
printf («%%+d = «%+d»\n» , $u ); // описатель знака с отрицательным целым числом
?>

Результат выполнения данного примера:

%b = «10100111101010011010101101» %c = «A» %d = «43951789» %e = «4.39518e+7» %u = «43951789» %u = «4251015507» %f = «43951789.000000» %o = «247523255» %s = «43951789» %x = «29ea6ad» %X = «29EA6AD» %+d = «+43951789» %+d = «-43951789»

Пример #8 printf() : описатели строк

// обычный вывод строки
printf («[%10s]\n» , $s ); // выравнивание вправо с пробелами
printf («[%-10s]\n» , $s ); // выравнивание влево с пробелами
printf («[%010s]\n» , $s ); // дополнение нулями также работает со строками
printf («[%»#10s]\n» , $s ); // использование собственного дополняющего символа «#»
printf («[%10.10s]\n» , $t ); // выравнивание влево с обрезкой в 10 символов
?>

Для форматного вывода в PHP используются две замечательных функции: printf() и sprintf() . У них достаточно много возможностей, которые мы обсудим в этой статье.

Сразу скажу, что разница между printf() и sprintf() лишь в том, что первая выводит строку сразу в выходной поток (например, в браузер), а вторая возвращает её.

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

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

  1. Спецификатор заполнения . Позволяет заполнить строку до заданного размера конкретным символом. По умолчанию этим символом является пробел.
  2. Спецификатор выравнивания . Данный спецификатор позволяет задать выравнивание строки по правому краю (по умолчанию), либо по левому краю (если указать « «).
  3. Спецификатор минимальной ширины . Если результат будет иметь меньшую длину строки, то она будет заполнена символами из спецификатора заполнения до указанной ширины.
  4. Спецификатор точности . Позволяет указать, какое количество знаков после запятой оставить у числа с плавающей точкой.
  5. Спецификатор типа . Этот спецификатор указывает тип выводимых данных. Их там 8 штук, но на практике используются следующие:
    • d — целое число в десятичном виде.
    • f — число с плавающей точкой в десятичном виде.
    • s — строка.

Давайте разберём классический пример по выводу отформатированной даты :

Нетрудно догадаться, что в результате будет выведена такая строка: «Дата написания статьи: 28.09.2012 «. Обратите внимание, сколько групп спецификаторов, столько и параметров передаётся помимо самого формата. Строка «Дата написания статьи: » является директивой, и она остаётся без изменений. Теперь разберём для примера вторую группу спефикаторов, которая отвечает за месяц. Другие группы абсолютно идентичны.

  • %
  • — символ, которым заданный параметр будет заполняться до требуемой ширины.
  • 2 — минимальная ширина. Соответственно, если длина строки меньше, то она будет заполнена .
  • d — выводиться будет как целое число. Если поставить, например, b (ещё один спецификатор типа), то выведится это же число, но в двоичной форме.

Приведу ещё один популярный пример использования функции printf (и sprintf()) , связанный с окргулением чисел:

Давайте разберём первый аргумент функции printf() :

  • % — начало группы спецификатора.
  • — символ заполнения до требуемой длины.
  • 6 — требуемая длина (точка, безусловно, также входит в эту длину).
  • .2 — точность до 2-х знаков после запятой.
  • f — тип чисел с плавающей точкой. Собственно, округление имеет смысл только для этого типа.

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

printf («как форматировать», парметр1, параметр2, . ) — выводит результат на экран

$result=sprintf («..», . . . ) — тоже самое, только строка не выводиться, а помещается в $result

Цитата из перевода мануала (ПРИМЕРЫ ниже:-):

sprintf

Описание

Возвращает строку, обрабатываемую в соответствии с форматирующей строкой format .

Форматирующая строка, содержащая ноль или более директив: обычные символы (кроме %) которые копируются прямо в результат, и that are copied directly to the result, и описания изменений , каждое из которых выполняет определенные действия. Это применительно и к sprintf() и к printf()

Каждое описание изменений состоит из следующих элементов, в порядке:

Дополнительный описатель заполнения , который говорит, какие символы будут использоваться для заполнения результата до правильног размера строки. Это могут быть пробелы или 0 (символ нуля). По умолчанию заполняется пробелами. Алтернативный символ заполнения может быть определен одинарной кавычкой («). См. примеры ниже.

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

Дополнительный описатель ширины , который говорит, с каким количеством символов (минимум) пожет производится данная замена.

Дополнительный описатель точности , который говорит, сколько десятичных знаков следует отображать для чисел с плавающей точкой. Этот описатель не действует на остальные типы, кроме double. (другая полезная функция для форматирования чисел это number_format() .)

Описатель типа , который говорит о том, как тип данных аргумента должен трактоваться. Возможные типы:

% — символ процента. Аргумент не требуется.
b — аргумент трактуется как integer и представляется как двоичное число.
c — аргумент трактуется как integer и представляется как символ с ASCII значением.
d — аргумент трактуется как integer и представляется как десятичное число.
f — аргумент трактуется как double и представляется как число с плавающей точкой.
o — аргумент трактуется как integer и представляется как восьмиричное число.
s — аргумент трактуется и представляется как строка.
x — аргумент трактуется как integer и представляется как шестнадцатиричное число (с буквами в нижнем регистре).
X — аргумент трактуется как integer и представляется как шестнадцатиричное число (с буквами в верхнем регистре).
Примеры

Пример 2. sprintf: форматирование денежной еденицы

$money1 = 68.75; $money2 = 54.35; $money = $money1 + $money2; // echo $money will output «123.1»; $formatted = sprintf («%01.2f», $money); // echo $formatted will output «123.10»

Примеры

String vsprintf (string format, array args)

Эта функция подобна sprintf(), но она принимает не переменное число аргументов, а массив.

Производит вывод одного или нескольких значений.
Синтаксис:

Echo(string arg1, string . )

Функция echo() выводит значения перечисленных параметров.
echo() — фактически языковая конструкция, поэтому для нее не обязательны скобки, даже если используется несколько аргументов.
echo «Перенос на следующую строку,имеющийся в коде, сохраняетсяи используется при выводе».
«чтобы избежать этого используйте».
«оператор конкатенации»;

Вывод отформатированной строки.
Синтаксис:

Int printf(string format [, mixed args, . ]);

Делает то же самое, что и sprintf(), только результирующая строка не возвращается, а направляется в браузер пользователя.

Производит форматирование строки с подстановкой переменных.
Синтаксис:

Эта функция возвращает строку, составленную на основе строки форматирования, содержащей некоторые специальные символы, которые будут впоследствии заменены на значения соответствующих переменных из списка аргументов.
Строка форматирования $format может включать в себя команды форматирования, предваренные символом %.
Все остальные символы копируются в выходную строку как есть. Каждый спецификатор формата (то есть, символ % и следующие за ним команды) соответствуют одному, и только одному параметру, указанному после параметра $format. Если же нужно поместить в текст % как обычный символ, необходимо его удвоить:

Echo sprintf(«The percentage was %d%%»,$percentage);

Каждый спецификатор формата включает максимум пять элементов (в порядке их следования после символа %):

Необязательный спецификатор размера поля, который указывает, сколько символов будет отведено под выводимую величину.
В качестве символов-заполнителей (если значение имеет меньший размер, чем размер поля для его вывода)
может использоваться пробел или 0, по умолчанию подставляется пробел. Можно задать любой другой символ-наполнитель, если указать его в строке форматирования, предварив апострофом.
Опциональный спецификатор выравнивания, определяющий, будет результат выровнен по правому или по левому краю поля. По умолчанию производится выравнивание по правому краю, однако можно указать и левое выравнивание, задав символ — (минус).

Необязательное число, определяющее размер поля для вывода величины. Если результат не будет в поле, то он «вылезет» за края этого поля, но не будет усечен.
Необязательное число, которое предварено точкой «.», предписывающее, сколько знаков после запятой будет в результирующей строке.
Этот спецификатор учитывается только в том случае, если происходит вывод числа с плавающей точкой, в противном случае он игнорируется.
Наконец, обязательный (заметьте — единственный обязательный!) спецификатор типа величины, которая будет помещена в выходную строку:

b — очередной аргумент из списка выводится как двоичное целое число
c — выводится символ с указанным в аргументе кодом
d — целое число
f — число с плавающей точкой
o — восьмеричное целое число
s — строка символов
x — шестнадцатиричное целое число с маленькими буквами a-z
X — шестнадцатиричное целое число с большими буквами A-Z

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

$money1 = 68.75;
$money2 = 54.35;
$money = $money1 + $money2;
// echo $money выведет «123.1».
$formatted = sprintf («%01.2f», $money);
// echo $formatted выведет «123.10»!

Вот пример вывода целого числа, предваренного нужным количеством нулей:

Производит интерпретацию строки согласно формату и занесение значений в переменные.

Mixed sscanf(string str, string format [, string var1 . ])

Функция sscanf() является противоположностью функции printf().

Она интерпретирует строку str согласно формату format, аналогично спецификации printf().

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

// получение серийного номера$serial = sscanf(«SN/235-0001», «SN/%3d-%4d»);
echo $serial*10000+$serial; // выводит: 2350001
// и даты изготовления$date = «January 01 2000»;
list($month, $day, $year) = sscanf($date, «%s %d %d»);
echo «Дата: $year-«.substr($month,0,3).»-$dayn»;
// выводит: 2000-Jan-01

При указании дополнительных необязательных параметров (их следует передавать по ссылке)

функция возвращает их число. Те переменные, которые не получают значений, в возвращаемом значении не учитываются.

// генерируем XML запись из строки$auth = «765tLewis Carroll»;
$n = sscan($auth,»%dt%s %s», &$id, &$first, &$last);
echo »
$first
$last
n»;

Int fprintf (resource handle, string format [, mixed args])

Записывает строку, созданную с использованием строки формата format, в поток, дескриптор которого передается в handle. Аргумент format подробно рассмотрен в описании функции sprintf().

fprintf(): заполнение нулями

fprintf(): форматирование денежных величин

Записывает отформатированную строку в поток (PHP 5)

Int vfprintf (resource handle, string format, array args)

Записывает строку, отформатированную в соответствии с format, в ресурс потока, указанный дескриптором handle. Форматирование осуществляется аналогично sprintf().

Работает так же, как и fprintf(), но принимает массив аргументов, а не переменное число аргументов.

Возвращает длину выведенной строки.

See also: printf(), sprintf(), sscanf(), fscanf(), vsprintf(), and number_format().
Examples

vfprintf(): zero-padded integers

Выводит отформатированную строку (PHP 4 >= 4.1.0, PHP 5)

Int vprintf (string format, array args)

Выводит значения массива args, отформатированные в соответствии с аргументом format, описанном в документации функции sprintf().

Эта функция подобна printf(), но она принимает не переменное число аргументов, а массив.

Возвращает длину выведенной строки

Форматирует число с разделением групп (PHP 3, PHP 4, PHP 5)

String number_format (float number [, int decimals])

string number_format (float number, int decimals, string dec_point, string thousands_sep)

number_format() возвращает отформатированное число number. Функция принимает один, два или четыре аргумента (не три):

Если передан только один аргумент, number будет отформатирован без дробной части, но с запятой («,») между группами цифр по 3.

Если переданы два аргумента, number будет отформатирован с decimals знаками после точки («.») и с запятой («,») между группами цифр по 3.

Если переданы все четыре аргумента, number будет отформатирован с decimals знаками после точки и с разделитилем между группами цифр по 3, при этом в качестве десятичной точки будет использован dec_point, а в качестве разделителя групп — thousands_sep.

Используется только первый символ строки thousands_sep. Например, при передаче foo в качестве thousands_sep для форматирования числа 1000, number_format() возвращает 1f000.

Пример использования number_format()

Во Франции обычно используются 2 знака после запятой («,»), и пробел (» «) в качестве разделителя групп. Такое форматирование получается при использовании следующего кода:

// английский формат (по умолчанию)
$english_format_number = number_format($number);
// 1,234

// французский формат
$nombre_format_francais = number_format($number, 2, «,», » «);
// 1 234,56

// английский формат без разделителей групп
$english_format_number = number_format($number, 2, «.», «»);
// 1234.57

Стандартная функция консольного вывода в языке C — printf. Описание её содержится в заголовочном файле stdio.h. При помощи этой функции можно выводить данные или пользовательские сообщения в консоль. Язык C чувствителен к регистру. К примеру, две функции printf и scanf отличаются от подобных им Printf и Scanf. Все символы в функциях printf и scanf также должны быть записаны в нижнем регистре. Одним из простейших примеров C printf, выводящим на экран знакомое приветствие hello world, является:

Определение функций группы printf в файле «stdio.h»

Файл «stdio.h» относится к стандартной библиотеке ввода/вывода в языке С. Описание printf и подобных ей функций приводится в нём следующим образом:

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

Семейство функций printf

Функции группы printf в языке C служат для обработки и форматированного вывода данных в стандартный поток. Причём функции printf и vprintf производят запись в стандартный поток stdout, функции fprintf и vfprintf отправляют значения выводимых аргументов в некоторый заданный выходной поток, а snprintf, sprintf, vsnprintf и vsprintf записывают данные в символьную строку. Все перечисленные функции работают с использованием строки формата, указывающей необходимые преобразования аргументов для вывода.

Функция fprintf записывает результат в выходной поток stream. В буфер, представляющий собой символьную строку, выводит результат функция sprintf. Поведение функции не определено, если подлежащая выводу строка превышает размер массива буфера.

Функция snprintf так же, как и предыдущая, записывает данные в строковый буфер. Полученная строка символов завершается нулевым символом, если только bufsz (размер буфера) не равен нулю. Иначе, если значение bufsz равно нулю, то в буфер ничего не выводится, а сам буфер вполне может являться нулевым указателем, но возвращаемое значение (количество байтов, которое должно было быть записано) все равно вычисляется.

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

Подробнее рассмотрим функцию printf.

Общее описание

В языке C печать символов через стандартный поток вывода осуществляется посредством вызова функции printf. Команда printf в C форматирует набор выводимых данных, и они отправляются в стандартный поток вывода stdout. Значения, переданные в качестве аргументов функции, выводятся в консоль согласно указанной строке форматирования, которая в свою очередь заключает в себе две разновидности элементов. Первая разновидность — это символы, выводимые на экран, а элементы, определяющие особенности формата данных и отвечающие за метод представления аргументов при выводе, относятся ко второму виду.

При выводе переменных с printf в C особые комбинации символов в строке аргументов заменяются на преобразованные в соответствии с этими символами данные, причём для каждого типа данных существуют свои спецификации формата вывода.

Тип функции и возвращаемое значение

Функция printf, имеющая возвращает целочисленную величину, обозначающую количество напечатанных на экране символов. К примеру, можно присвоить:

int k = printf(«Привет %c %d %s», «a», 11, «всем!»),

и тогда по значению переменной k легко определяется, возникла ли ошибка при выводе. В случае возврата отрицательного значения (если функция вернула «-1») можно сделать вывод, что произошла ошибка при её выполнении.

Синтаксис и зависимости

Чтобы использовать функцию printf, требуется подключить заголовочный файл «stdio.h» следующим образом:

Шаблон функции выглядит:

int printf(const char *формат, . )

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

Форма задания спецификаций формата:

Форматирование с printf в C выходных значений

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

Символ «%» указывает на начало спецификации формата вывода, следом за ним идёт код формата. Все поля в спецификации представляют собой отдельные, определяющие условия форматирования числа или символы.

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

Для явного указания, который по счёту аргумент нужно задействовать, возможно использовать «%m$» вместо «%» и «*m$» вместо «*», причём m, целочисленное десятичное значение, обозначает позицию нужного аргумента (индексирование начинается с единицы).

Параметры

Флаги, используемые в строке формата
Флаг Описание
Выравнивание результата по левому краю в поле вывода
+ При выводе численного значения, имеющего знак, принудительно печатается «+» перед положительной величиной (по умолчанию выводится только «-» перед отрицательным значением)
Для целых чисел и чисел с плавающей запятой ведущие нули используются вместо символов пробела для заполнения левых разрядов в случае, если задана ширина поля, превышающая длину числа. Для целых чисел флаг игнорируется, если явно указана точность. Для других преобразований с использованием этого флага поведение функции не определено. Флаг «0» не учитывается, если присутствует флаг «-«
space Если результат вывода выражения, имеющего знак, не начинается с символа этого знака или пуст, то пробел добавляется к результату. Флаг «space» игнорируется, если присутствует флаг «+»
# Выполняется альтернативная форма преобразования

Различные спецификаторы формата

Спецификатор формата Использование и описание для printf C Тип аргумента
% Запись литерала «%»
c Вывод одного символа. Происходит преобразование аргумента в тип unsigned char. При использовании модификатора «l» аргумент преобразуется в строку символов unsigned char
s Печать строки символов. Аргумент должен являться указателем на начальный элемент массива символов char char *
d
i
Вывод десятичного представления целочисленного значения со знаком int
o Вывод восьмеричного представления без знакового целочисленного значения unsigned int
x
X
Вывод шестнадцатеричного представления без знакового целочисленного значения. Символы «a», «b», «c», «d», «e», «f» применяются для преобразования «x». А для преобразования «X» — «A», «B», «C», «D», «E», «F» unsigned int
u Вывод десятичного преобразования без знакового целочисленного значения. Если преобразованное значение и точность вместе равны 0, то символы не выводятся unsigned int
f
F
Вывод десятичного представления числа с плавающей запятой, имеющего знак double
e
E
Вывод десятичного экспоненциального представления округлённого и преобразованного так, что перед запятой остаётся одна цифра, а количество цифр после запятой соответствует точности представления (по умолчанию точность равна 6, а если указан 0, то символ запятой не выводится вообще). Символ «е» выводится в верхнем или нижнем регистре в зависимости от преобразования double
a
A
Вывод шестнадцатеричного представления числа с плавающей запятой double
g
G
Вывод десятичного представления числа с плавающей запятой или его десятичного экспоненциального представления в зависимости от значения и точности double
n Возврат числа элементов, выведенных функцией printf. Результат записывается в переменную, на которую указывает аргумент. Спецификация может не содержать флагов, ширины поля или точности int *
p Вывод указателя void *

Модификатор ширины поля

В строке формата в printf C может быть записано целое число после знака процента и перед командой форматирования. Оно является модификатором ширины поля и влияет на представление отображаемых данных. Наименьшая ширина поля, предназначенная для значения, определяется этим числом, и присутствие такого модификатора в случае, если аргумент оказывается меньше выделенного ему поля, вызывает добавление к результату пробелов или нулей. Заполнителем по умолчанию служит символ пробела, однако можно установить ноль, прописав его перед спецификацией ширины. Модификатор указывает минимум ширины, и любое превышающее этот минимум значение будет напечатано без помех. Число, к примеру, состоящее менее чем из восьми символов и печатаемое со спецификацией «%08d», окажется дополненным до необходимых восьми знаков нулями.

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

Модификатор точности

Модификатор точности служит для определения числа печатаемых десятичных знаков в представлении чисел. Для добавления модификатора точности необходимо поставить точку после спецификации ширины поля и указать нужное значение точности после неё. Модификатор точности определяется для «e», «f», «a», «E», «A» и «F» форматов. Для целых чисел модификатор устанавливает количество отображаемых цифр, добавляя нули в левый разряд, если нужно, а при выводе рациональных чисел определяет необходимое количество знаков после запятой. Применительно к строковым переменным: следующее после точки число в модификаторе точности служит определителем максимальной длины поля при выводе. К примеру, при заданной спецификации формата «%4.8s» будет выведена строка, длина которой находится в диапазоне от четырёх до восьми символов, в случае превышения крайние символы будут опущены.

Другие модификаторы формата

Выравниванием по умолчанию является выравнивание по правому краю, однако это можно изменить, поставив знак «-» после «%». Такая спецификация формата устанавливает выравнивание по левому краю.

Кроме того, функция printf способна различать короткие и длинные типы выводимых целых значений. Допустимые спецификаторы: «о», «d», «u», «i», «x» и «X». Длинный тип значения устанавливается модификатором «l», а короткий — модификатором «h». Например, при выводе длинного целого числа и значения типа short unsigned int спецификации формата выглядят как «%ld» и «%hu» соответственно.

Примеры

1. Описание printf C и результаты вызова каждой функции:

2. Вывод на экран простого диалогового сообщения:

3. Программный код:

Выражения, заданные в перед спецификациями формата, печатаются на экране, также как и следующие за строкой формата аргументы. Результат выполнения приведённых выше функций printf C, описание выходных данных:

Данный пример иллюстрирует вывод на экран при помощи различных форматов строк, целочисленных переменных, символов, а также чисел с плавающей точкой.

Функция c возвращает отформатированную строку

7 Zulakis [2012-06-24 22:46:00]

Я хотел бы сделать что-то вроде этого:


поэтому я ищу функцию, которая возвращает форматированную строку.

c string printf

2 ответа

5 Решение eran [2012-06-24 23:29:00]

Учитывая, что такая функция не существует, рассмотрим несколько иной подход: make writeLog printf-like, т.е. взять строку и переменное количество аргументов. Затем отформатируйте сообщение внутри. Это решит проблему управления памятью и не нарушит существующее использование writeLog .

Если вы найдете это возможным, вы можете использовать что-то в этих строках:

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

Есть функция сродни Printf но только возвращает результат отформатированной строки в C?

Я не хочу выводить что-либо с помощью fprintf , Но только результат «Error in pcap_findalldevs: %s\n», errbuf , Что функция для этого?

5 ответов

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

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

Обычно используется sprintf не выполняет проверку границ, и как таковой является по своей сути небезопасно.

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

Такой же как sprintf , Но написать максимум n символов, включая нуль. ведомой Возвращает количество символов, которое было бы написано, если n был достаточно большим, так что вы можете перераспределить буфер, если это необходимо.

Такой же как sprintf кроме двойной указатель передается в буфер будет изменен, если это необходимо, чтобы соответствовать выходной. Это расширение GNU, также доступны в BSD, то можно эмулировать как (Игнорирование проверки ошибок)

Это sprintf() который также имеет некоторые полезные варианты, как vsprintf() которая принимает указатель на список аргументов. Есть также версии буфера защиты в некоторых реализациях.

sprintf копирует результат в char * вместо того, чтобы писать его stdout или файл.

printf(const char format, . )

fprintf(FILE * file, const char format, . )

sprintf(char * string, const char format, . )

sprintf оригинальный вызов, но следует считать устаревшим в пользу snprintf который позволяет передавать размер. Другой альтернативой является asprintf , Который будет выделять строку, достаточно большой для хранения результата.

F#3: Форматирование текста

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

Поскольку F# является языком .NET, мы всегда можем использовать Console.WriteLine (..) и String.Format (..), где мы можем использовать любой из обычных форматеров, которые вы использовали в своем обычном коде .NET.

Однако F# также поддерживает более похожий на синтаксис метод C, который доступен в модуле Core.Printf. Одна функция внутри него может использоваться вместо использования класса Console.WriteLine (..) .NET.

Эквивалентной функцией F#, которую стоит использовать для записи в стандартный вывод, является printfn, которая на самом деле является предпочтительным методом при работе с форматированием текста в F#.

Почему printfn предпочтительнее Console.WriteLine (..)?

Существует несколько причин, по которым printfn является предпочтительным, некоторые из основных причин приведены ниже:

  • Проверка статического типа. Это означает, что если мы передадим значение int там, где ожидается строка, нас предупредят об этом
  • Поскольку printfn является нативной функцией F#, она действует так же, как любая другая функция F#.

Рассмотрим следующие фрагменты кода

Если мы сейчас посмотрим на скриншот этого кода в IDE Visual Studio, мы действительно увидим, что строки, которые мы ожидали потерпеть неудачу, ясно показаны как ошибочные:

Как использовать printfn?

Возможно, лучше всего начать с рассмотрения некоторых стандартных форматеров, доступных для работы со значениями. В следующей таблицеMSDN показаны стандартные операторы, доступные вам: msdn.microsoft.com/en-us/library/ee370560.aspx

Так что насчет создания отличного форматирования кроме стандартного?

Итак, теперь мы увидели, как записать отформатированный вывод в стандартный вывод (printfn сделал это), но что если мы захотим использовать отформатированную строку в других местах? Что, если мы хотим связать строковое значение с красиво отформатированной строкой, которую мы сконструировали, с использованием некоторых из приведенных выше средств форматирования, или даже хотели записать в StringBuilder или TextWriter, позволяет ли F # сделать это легко?

Ну да, на самом деле это так, вы найдете множество других полезных функций в модуле Core.Printf. Полный список на момент написания этого поста был следующим:

Я не собираюсь проходить через все это, но я рассмотрю самые распространенные:

bprintf

Печатает в StringBuilder.

Это даст этот вывод в консольном приложении F#

fprintf

Печатает в text writer.

Это приведет к тому, что файл будет создан в temp

Sprintf — Возвращает отформатированную строку

sprintf — возвращает отформатированную строку.

Описание

string sprintf (string format [, mixed args])

Возвращает строку, созданную в соответствии со строкой форматирования format .

Строка форматирования состоит из 0 или более директив: обычных символов (исключая % ), которые копируются прямо в результат, и спецификаций конвертации, каждая из которых приводит к извлечению её собственного параметра. Это применяется к sprintf() и к printf() .

Каждая спецификация конвертации состоит из знака процентов ( % ) с последующим одним или более из следующих элементов, в данном порядке:


Необязательный padding-спецификатор , который сообщает, какой символ будет использоваться для заполнения результатов до размера строки. Это может быть символ space/пробел или 0 (символ нуль). По умолчанию заполняется пробелами. Альтернативный заполнитель может быть специфицирован с помощью префикса — одинарной кавычки ( ‘ ). См. примеры далее.

Необязательный alignment-спецификатор , который сообщает, должен ли результат выравниваться влево или вправо (left-justified или right-justified). По умолчанию right-justified; символ — здесь делает left-justified.

Необязательное число, width-спецификатор , который сообщает, сколько символов (минимум) должна дать эта конвертация.

Необязательный precision-спецификатор , который сообщает, сколько десятеричных цифр должно выводиться для чисел с плавающей точкой. Эта опция не оказывает действия на другие типы, кроме float . (Для форматирования чисел используется также функция number_format() .)

type-спецификатор , который сообщает, как какой тип должны рассматриваться данные аргумента. Возможные типы:

% — литеральный символ процентов. Аргументы не требуются.
b — аргумент рассматривается как integer и представлен как двоичное число.
c — аргумент рассматривается как integer и представлен как символ с этим ASCII-значением.
d — аргумент рассматривается как integer и представлен как (знаковое) десятеричное число.
u — аргумент рассматривается как integer и представлен как беззнаковое десятеричное число.
f — аргумент рассматривается как float и представлен как число с плавающей точкой.
o — аргумент рассматривается как integer и представлен как восьмеричное число.
s — аргумент рассматривается и представляется как строка/string.
x — аргумент рассматривается как integer и представлен как шестнадцатеричное число (с буквами в нижнем регистре).
X — аргумент рассматривается как integer и представлен как шестнадцатеричное число (с буквами в верхнем регистре).

Как и в PHP версии 4.0.6, строка форматирования поддерживает нумерацию/обмен аргументов (numbering/swapping). Вот пример:

Пример 1. Обмен/swapping аргументов

Это выведет «There are 5 monkeys in the tree». Но представьте, что мы создаём строку форматирования в отдельном файле, что является обычным, поскольку мы хоти интернационализировать её, и мы переписываем:

Пример 2. Обмен аргументов

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

Пример 3. Обмен аргументов

Теперь появилось преимущество: вы можете повторять заглушки без добавления аргументов в коде. Например:

Sprintf — Возвращает отформатированную строку

Перевод статьи «Secrets of printf» [1], статья посвящена практическому применению оператора вывода printf.

Оператор printf — это просто функция языка C, которая выполняет форматированную печать неких значений, параметров функции. «Форматированную» — означает, что перед выводом параметров на печать параметры функции преобразуются в текст по особым правилам (формату), задаваемым специальной строкой, так называемой строкой форматирования. Точно такая же функция printf есть и на языке PERL. В этой заметке сделана попытка объяснить, как работает printf, и как правильно разработать соответствующую строку форматирования для любого случая.

[1. Основные понятия]

В старые времена программисты должны были писать свои собственные подпрограммы для ввода и вывода чисел. По сути это было не очень сложным делом. Сначала надо было выделить массив текстовых символов для хранения результата, затем просто разделить число на 10, запомнить остаток, добавить 0x30 для получения ASCII кода цифры, и сохранить цифру в конец массива. Далее эту процедуру нужно было повторить, чтобы найти все десятичные цифры числа. Затем нужно было вывести массив на печать. Все просто, не правда ли?

Однако несмотря на то, что просто (для гения типа Эйнштейна), однако все еще требует применения некоторых усилий. И что мы будем делать в более сложных случаях при проверке ошибок, или при выводе отрицательных чисел? Чтобы решить эти проблемы, программисты создали специальные библиотеки с предварительно написанными функциями вывода. И это было неплохо. В конечном счете самые популярные из этих функций были канонизированы для того, чтобы составить «стандартные» библиотеки.

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

Так родился printf.

[2. Простая печать]

В самом простом случае функция printf получает один аргумент: строка символов, которая должна быть напечатана. Как ясно из названия, эта строка состоит из символов, каждый из которых будет выведен именно так, как он появляется в строке. Так, оператор printf(«xyz»); должен просто вывести сначала x, затем y, и наконец z. Это не является по-настоящему «форматированной» печатью (formatted printf), однако это базовая операция, которую может произвести printf.

2.1. «Натуральные» специальные символы

Чтобы идентифицировать начало строки, мы применили двойные («) кавычки в её начале. Чтобы идентифицировать конец строки, мы поместили двойные кавычки также и в конец строки. Но как быть, если нам нужно напечатать также и двойные кавычки? Мы не можем просто поместить двойные кавычки в печатаемую строку, потому что тогда этот символ будет ошибочно задавать маркер конца строки. Таким образом, двойные кавычки стали специальным символом. Для них уже не работает правило печатаю-то-что-вижу. Как все-таки напечатать двойные кавычки?

Различные языки программирования применяют разные способы для решения этой проблемы. Некоторые требуют, чтобы специальный символ был введен дважды. Язык C использует обратный слеш (делительная черта, \) в качестве управляющего символа (escape character), для изменения значения следующего за ним символа. Таким образом, для печати двойных кавычек нужно указать обратный слеш и за ним двойную кавычку (\»). Чтобы напечатать сам обратный слеш, то его нужно ввести дважды. Таким образом, первый обратный слеш означает «следующий символ имеет альтернативное значение», и второй обратный слеш теперь означает «напечатать обратный слеш».

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

\ escape, управляющая последовательность для следующего символа
\\ печатается обратный слеш
« обозначает начало или конец строки
печатаются двойные кавычки
начало или конец символьной константы
\’ печатается одинарная кавычка
% начало спецификации формата
\% печатается символ процента
%% также печатается символ процента

2.2. Альтернативные специальные символы

Однако еще у нас есть символы, которые печатаются без обратного слеша как обычно, но когда слева к ним добавляется обратный слеш, они становятся также спецсимволами. Например, это символ новой строки (new line, или line feed LF, код ASCII 0x0A). Чтобы напечатать букву n, нам нужно просто указать в строке n. Чтобы перевести печать на новую строку, мы должны напечатать \n, что вовлекает альтернативное значение для n (новая строка). В следующей таблице приведен список таких альтернативных спецсимволов.

\a звуковой сигнал, предупреждение (звоночек, bell)
\b backspace, вернуться на 1 символ назад (затереть символ)
\f form feed, переход на новый лист
\n newline, новая строка (linefeed, перевод строки, код ASCII 0x0D, переход печати на новую строку)
\r carriage return, возврат каретки (CR, код ASCII 0x0D, позиция печати возвращается на начало строки)
\t tab, табуляция по горизонтали
\v vertical tab, вертикальная табуляция

[3. Как задавать формат вывода числа (Format Specifications)]

Настоящая сила printf раскрывается при выводе на печать переменных. К примеру, мы можем указать спецификатор формата %d . Если такой спецификатор присутствует в строке, то мы должны предоставить число в качестве второго параметра функции printf. Функция printf сделана так, что может принимать неограниченное количество параметров, если это необходимо (printf относится к функциям с переменным количеством параметров). Пример ниже показывает, как это происходит.

В этом простом примере функция printf имеет 2 аргумента. Первый аргумент — строка «I am %d years old\n» (в ней содержится спецификатор формата %d ). Вторым аргументом является целое число age.

3.1. Список аргументов

Когда printf обрабатывает свои аргументы (список аргументов, отделенных друг от друга запятыми), он начинает печатать символы, которые находит в левом аргументе, символ за символом. Когда в этом процессе попадается символ процента (%), то printf знает, что это спецификатор формата — специальный набор символов, который задает, как надо вывести число. Следующее по порядку с списке аргументов число выводится так, как указано в спецификаторе формата. Затем процесс обработки символов (вывод их на печать) первого аргумента продолжается. Можно указать в строке 1 аргумента функции printf несколько спецификаторов формата. В этом случае 1 спецификатор будет выводить первый дополнительный аргумент, 2 спецификатор второй дополнительный аргумент и так далее, до конца строки. Вот еще один пример (указано 2 спецификатора формата и два дополнительных аргумента функции printf):

3.2 Символ процента (Percent, %)

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

%c выводит на печать одиночный символ (character)
%d выводит на печать десятичное число (представление числа с основанием 10)
%e выводит на печать числа с плавающей запятой (floating-point) в экспоненциальном формате
%f выводит на печать числа с плавающей запятой (floating-point)
%g выводит на печать числа с плавающей запятой (floating-point) в общем формате
%i выводит на печать десятичного целого числа (представление числа с основанием 10)
%o выводит на печать числа в восьмеричном формате (представление числа с основанием 8)
%s выводит на печать строки символов
%u выводит на печать целое десятичное число без знака (представление числа с основанием 10)
%x выводит на печать целого шестнадцатеричного числа (представление числа с основанием 16)
%% выводит на печать символ процента (можно использовать для этого также \%)

Самый простой вывод десятичного числа (целого и с плавающей точкой) требует указания только %d. В таблице приведены некоторые примеры аргументов printf и полученных результатов.

Имейте в виду, что в случае использования %d размер получаемой строки заранее не известен. Функция printf сгенерирует строку такого размера, какой нужен.

3.3. Опция ширины формата (Width Option)

Как уже упоминалось, простой печати чисел недостаточно. Есть другие желаемые опции. Возможно, самая важная из них — опция ширины формата. Если указать спецификатор формата %5d, то будет гарантировано, что вывод числа всегда займет 5 символьных позиций (если нужно, то больше, но никак не меньше). Эта возможность очень полезна при печати таблиц, потому что и большие, и маленькие числа займут в строке одинаковое место. Не так давно вся печать была моноширинной (monospaced, все символы по точкам в ширину были одинаковы), т. е. и символ w, и символ i занимали одинаковое место в строке по ширине. Это остается общим правилом в текстовых редакторах, используемых программистами.

Чтобы напечатать десятичное число определенной (как минимум заданной, не меньше) ширины, скажем шириной в 5 пробелов, спецификатор формата должен быть %5d. В таблице приведены простые примеры использования опции ширины (пробелы для наглядности показаны нижней квадратной скобкой).

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

Чтобы добиться нормального использования, поле опции ширины должно быть указано таким, чтобы удовлетворять максимальному размеру ожидаемого выводимого числа. Например, если Ваши числа могут состоять из 1, 2 или максимум 3 цифр, то формат %3d подойдет. Опция ширины будет работать неправильно, если потребуется напечатать число, которое слишком большое, чтобы уместиться в заданную ширину поля. Функция printf примет решение вывести такие числа полностью, даже если они займут место больше, чем задано в спецификаторе ширины формата. Так сделано потому, что лучше вывести правильный ответ, пусть даже некрасиво, чем напечатать урезанный (неправильный) результат, и потом гадать, где же произошла ошибка.

3.4. Заполнение лишнего места

Когда печатается маленькое по размеру число наподобие 27 в поле формата %5d, встает вопрос — чем и как заполнить 3 другие (пустые) места печати. Цифры 27 можно напечатать по-разному: вывести в первых двух позициях, в последних двух позициях, или где-то посередине. Также пустые места могут быть заполнены не просто пробелами, а звездочками (***27, или 27***, или **27*), или знаками доллара ($$$27), или символами равенства (===27), или начальными нулями (наподобие 00027).

Эти дополнительные символы часто называют символами «проверочной защиты» (check protection), потому что они предназначены помешать плохим парням изменить печатаемую сумму в долларах. Относительно просто поменять заполнение пробелами на что-то другое. Гораздо сложнее подменить символ звездочки, знак доллара и ли символ равенства.

Функция printf предоставляет заполнение пространства пробелами (слева или справа), и заполнение нулями (только слева). Если Вам нужна check protection, или центрирование, то нужно использовать какие-то другие дополнительные методы. Но даже без check protection или центрирования printf
все равно имеет впечатляющую коллекцию опций форматирования.

3.5. Опция выравнивания (Justify Option)

Вывод на печать чисел функцией printf может быть выровнена влево (left-justified, напечатана в поле слева) или вправо (right-justified, напечатано в поле справа). Наиболее естественной выглядит печать чисел выровненными вправо, с дополнением пробелами слева. Так работает спецификатор формата %5d, он означает: напечатать число по основанию 10 в поле шириной 5 символов, и цифры числа выровнять по правому краю, слева дополнив нужным количеством пробелов.

Чтобы сделать число выровненным слева, к спецификатору формата нужно добавить знак минуса (-). Чтобы напечатать число в поле шириной в 5 символов, с выравниванием по левому краю спецификатор формата будет %-5d. В таблице приведены некоторые примеры использования левого выравнивания.

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

3.6. Заполнение лидирующими нулями (Zero-Fill Option)

Чтобы печать даты выглядела красиво и качественно, обычно одиночные цифры даты и месяца дополняют слева нулем. Это и есть «лидирующий ноль». Мы можем написать May 5, 2003, или как принято в США 05/05/2003. Можно написать также дату в виде 2003.05.05. Обратите внимание, что лидирующий ноль не изменяет значение дат, а просто добавляет наглядности. Таким способом отформатированная дата хорошо выглядит в списке.

Когда используется zero-filled (заполнение лидирующими нулями), нули всегда добавляются спереди, и результат получается выровненным как по левому, так и по правому краю. В этом случае знак минуса не дает эффекта. Чтобы вывести число в 5 позиций с дополнением нулями слева применяйте спецификатор формата %05d. В таблице показаны примеры использования и полученные результаты.

Короткие числа будут дополнены лидирующими нулями. Числа большого размера будут напечатаны как есть, без изменения.

3.7. Забава со знаками «плюс»

Отрицательные числа всегда будут выведены со знаком минуса (-). Положительные числа и нули обычно не печатаются со знаком, однако Вы можете это задать принудительно. Символ плюса (+) в спецификаторе формата делают такой запрос. Чтобы напечатать число со знаком в поле шириной 5 символов, спецификатор формата должен быть %+5d. В таблице показаны примеры использования и полученные результаты.

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

Плюс и минус не связаны друг с другом. Они оба могут появляться в спецификаторе формата.

3.8. Невидимый знак «плюс»

Знак + немного причудлив, он может быть невидимым. В этом случае вместо печати + на положительных числах (и при печати 0), мы напечатаем пробел, где этот знак должен был бы находиться. Это может оказаться полезным при печати выровненных влево чисел, если Вы хотите, чтобы знак минуса значительно выделялся. В примерах ниже показаны два альтернативных варианта.

Помните о том, что спецификатор формата %-5d даст нам другой результат, который мы уже рассматривали ранее (он показан здесь снова для наглядности):

Имейте в виду, что знак + исчезает, но все еще занимает место слева от числа. Имейте в виду также, что мы можем скомбинировать некоторые опции в одном и том же спецификаторе формата. В этом случае мы имеем скомбинированные опции +, -, 5, или пробел, -, 5, или просто -, 5.

3.9. +, пробел и 0

Здесь приведен другой пример одновременного комбинирования некоторых опций в одном спецификаторе формата. Использование спецификаторов формата % 05d или %0 5d дадут нам следующие результаты:

Использование спецификаторов формата %+05d или %0+5d дадут нам следующие результаты:

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

3.10. Общие замечания по формату вывода

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

После опций если нужно, может быть указана минимальная ширина поля вывода.

[4. Вывод на печать строк]

Опция %s позволяет нам печатать строку внутри строки. Ниже дан пример.

Флаг левого выравнивания может быть применен к строкам, однако конечно же дополнение слева нулями (zero fill), знак +, и невидимый + являются бессмысленными.

[5. Вывод чисел с плавающей точкой (Floating Point)]

Числа с плавающей точкой наподобие 3.1415 содержат внутри себя точку. Обычные целые числа типа 27 не имеют такой точки.

Для печати чисел с плавающей точкой (float, double) флаги и правила работают точно так же, как и для целых чисел, но еще есть несколько новых опций. Самая важная указывает, какое количество цифр может появиться после десятичной точки. Это количество цифр называется точностью (precision) числа.

В обычной коммерции используются прайсы, где цены часто фигурируют как целые доллары или доллары и центы (precision составляет 0 или 2 цифры). Для цены на бензин цены упоминаются как доллары, центы, и десятая доля от цента (precision составляет 3 цифры). Ниже приведены примеры, как может быть выведено на печать число e=2.718281828.

Обратите внимание, что если в спецификаторе формата указаны точка и число, то это число (precision) указывает, сколько чисел должно появиться после десятичной точки.

Имейте в виду, что если не указаны точка и precision для %f, то по умолчанию будет приведен формат %.6f (6 цифр после десятичной точки).

Имейте также в виду, что если указана precision 0, то десятичная точка также исчезает. Если Вы хотите её вернуть, то нужно это сделать принудительно в виде простого текста (после спецификатора формата %f).

Мы можем указать оба и ширину (width), и точность (precision) одновременно в одном спецификаторе формата. Имейте в виду, что 5.2 означает общую длину 5, с 2 цифрами после десятичной точки. Самая распространенная ошибка, когда думают, что это означает 5 цифр до точки и 2 цифры после точки, но это неправильно. Будьте внимательны.

Можно также комбинировать precision с флагами, с которыми мы уже познакомились, чтобы указать левое выравнивание, дополнение слева нулями, применение знака +, и т. д.

[6. Как лучше всего разрабатывать формат]

Если Вы придумываете спецификатор формата, то первый шаг, который нужно сделать — решить, что именно Вы печатаете. Если это целое число (unsigned char, short, int, long), число с плавающей точкой (float, double), строка (char []) или одиночный символ (char), то Вы должны выбрать соответствующий спецификатор для базового типа формата.

Второй важный вопрос — какой ширины в символах должна быть печатаемое поле. Обычно это определяет самое большое по величине печатаемое число, которое Вы ожидаете при нормальной работе программы. Иногда этот размер определяется шириной предоставленного поля в форме или таблице (как например, в поле на кассовом чеке или на таблице счета-фактуры).

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

[7. Советы для тестирования]

Тест printf включает проверку появления подходящих проблем. Сам по себе алгоритм работы printf непрост для полного понимания — как будет работать вывод в разных ситуациях. Поэтому изучение тестового вывода printf даст более точную картину — что работает не так.

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

7.1. Простые случаи

Можно просто увидеть, есть ли у коротких чисел лидирующие нули. Если так, то в спецификаторе формата здесь должен быть 0. Также просто увидеть, есть ли у положительных чисел знак +. Если этот так, то + должен быть и в спецификации форматирования.

7.2. Перед, между, позади

Следующее, что нужно проверить — что печатается до выводимого числа, в промежутке, и после. К примеру, В спецификации форматирования типа x%5dz, где x стоит перед числом и z за числом. Части x и z не входят в спецификатор формата, но входят как часть в печатаемый результат. Все остальное относится к тому, что печатается «между».

Для того, чтобы определить, что же печатается за числом, посмотрите на вывод отрицательного числа чрезмерно большого размера. Любые пробелы до выведенного числа и после него покажут на пробелы до и после спецификатора формата. Например, если -2035065302 печатается как __-2035065302_ (здесь для наглядности пробелы заменены на подчеркивания), то можете быть уверенными, что строка печати была наподобие __%. _ , с двумя пробелами перед и одним пробелом после спецификатора формата. Это произошло потому, что чрезмерно большое число заняло все позиции, которые были отведены в спецификаторе формата.

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

7.3. Невидимый знак +

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

7.4. Левое выравнивание

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

[8. Заключение]

Функция printf является мощным инструментом (в умелых руках) для вывода чисел и чего-нибудь еще, хранимого в переменных. Из-за того, что инструмент мощный и имеет много возможностей, он несколько сложен в освоении. Если попытаться использовать printf наобум, без изучения документации, то его сложность часто делает невозможным понимание принципа вывода. Однако при незначительном изучении сложность может быть развернута в простые возможности, включающие width (ширина поля вывода), precision (точность), signage (управление выводом знака), justification (выравнивание) и fill (заполнение пустых мест поля вывода). Если распознать и понять эти возможности, то printf становится удобным и надежным помощником при выводе значений на печать.

[Ссылки]

1. Secrets of “printf”, Professor Don Colton, Brigham Young University Hawaii .
2. IAR EWB ARM: форматированный вывод printf библиотеки DLIB.

Илон Маск рекомендует:  Как продвигаются сайты, разработанные на конструкторах и CMS
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL