% | Символ процента. Аргументы не требуются. |
b | Аргумент рассматривается как целое число и печатается в бинарном представлении. |
c | Аргумент рассматривается как целое число и печатается как символ из таблицы ASCII с соответствующим кодом. |
d | Аргумент рассматривается как целое число и печатается как целое число со знаком. |
e | Аргумент считается за число в научной нотации (т.е. 1.2e+2). |
E | Аналогично спецификатору e , но использует
заглавные символы (т.е. 1.2E+2). |
f | Аргумент считается за число с плавающей точкой (с учётом локали). |
F | Аргумент считается за число с плавающей точкой (без учёта локали). |
g | Общий формат. Пусть P равно точности, если она не равно нулю, 6 — если точность не задана и 1, если точность задана как 0. Тогда, если преобразование со стилем «E» будет иметь показатель степени X: Если P > X ≥ −4, преобразование будет в стиле «f» и точность будет P − (X + 1). В обратном случае, преобразование будет в стиле «e» и точность будет P − 1. |
G | Аналогично спецификатору g , но использует E и f . |
h | Аналогично спецификатору g , но использует F .
Доступен с PHP 8.0.0. |
H | Аналогично спецификатору g , но использует E и F .
Доступен с PHP 8.0.0. |
o | Аргумент рассматривается как целое число и печатается в восьмеричном представлении. |
s | Аргумент рассматривается и печатается как строка. |
u | Аргумент рассматривается как целое число и печатается как беззнаковое целое число. |
x | Аргумент рассматривается как целое число и печатается в шестнадцатеричном представлении (буквы будут в нижнем регистре). |
X | Аргумент рассматривается как целое число и печатается в шестнадцатеричном представлении (буквы будут в верхнем регистре). |
Go имеет встроенную поддержку для форматирования строк
сродни | |
type point struct { x, y int } | |
Go предлагает несколько “глаголов” созданных
для форматирования общих Go значений. Например, это
выведет инстанс нашей | p := point{1, 2} fmt.Printf("%v\n", p) |
Если значение является структурой, вариант | |
The | |
Вариант форматирования | |
%T . | |
Форматирование булевых значений прямолинейно. | |
Существует множество операций для форматирования
целочисленных значений. Используйте | |
Это выведет бинарное представление числа. | |
Вывод символа, соответсвующего заданному числу. | |
| |
There are also several formatting options for
floats. For basic decimal formatting use | |
Так же имеется несколько опций для форматирования чисел с плавающей запятой. | |
| |
| fmt.Printf("%e\n", 123400000.0) fmt.Printf("%E\n", 123400000.0) |
%s . | fmt.Printf("%s\n", "\"string\"") |
Для двойных ковычек как в исходниках Go, используйте | fmt.Printf("%q\n", "\"string\"") |
Так же как и с целочисленными ранее, | fmt.Printf("%x\n", "hex this") |
Чтобы показать представление ссылки, используйте | |
При форматировании чисел вы часто захотите
контролировать ширину и точность итоговой
цифры. Чтобы установить ширину числа, укажите
число после | fmt.Printf("|%6d|%6d|\n", 12, 345) |
Вы так же можете указать ширифу вывода чисел с плавающей точкой, хотя зачастую вы так же хотели бы ограничить десятичную точность с шириной используя синтакс ширина.точность | fmt.Printf("|%6.2f|%6.2f|\n", 1.2, 3.45) |
Для вывода по левой стороне, укажите флаг | fmt.Printf("|%-6.2f|%-6.2f|\n", 1.2, 3.45) |
Возможно вы бы хотели контролировать ширину форматирования строк, например, для гарантии вывода в виде таблицы. | fmt.Printf("|%6s|%6s|\n", "foo", "b") |
Для вывода по левой стороне, укажите флаг | fmt.Printf("|%-6s|%-6s|\n", "foo", "b") |
До сих пор мы видели | s := fmt.Sprintf("a %s", "string") fmt.Println(s) |
Вы можете форматировать и выводить в | fmt.Fprintf(os.Stderr, "an %s\n", "error") } |
echo "Value of var is $var"
Однако команда echo не подойдет, если вам нужно распечатать форматированный вывод.
Здесь вам поможет команда printf. Команда printf в bash работает как команда printf в языке программирования C/C ++.
printf "Моей собаки %s %d лет.\n" Бобик 9
Первый аргумент %sожидает строку, %dожидает десятичное целое число, как в C/C ++. Не волнуйтесь, если вы не знакомы с C/C ++.
Вам не нужно изучать его только для использования команды printf в ваших сценариях Bash. Позвольте мне показать вам несколько примеров команды printf в Bash.
Начнем сначала с синтаксиса.
printf format [arguments]
Здесь format- строка, которая определяет, как будут отображаться последующие значения.
В этом примере printf “Моей собаки %s %d лет.\n” Бобик 9, «Моей собаки %s %d лет. \n» – это формат, за которым следуют аргументы Бобик и 9. Аргументы используются для замены спецификаторов формата (% s,% d и т. д.), Которые мы объясним позже в этой статье.
В простейшей форме printf можно использовать как команду echo для отображения строки.
printf "Hello World\n"
Обратите внимание на символ новой строки \n в конце? Разница между командами echo и PRINTF является то, что echo автоматически добавляет символ новой строки в конце, но для Printf, вы должны явно добавить.
Имейте в виду, что строка формата пытается применяться ко всем аргументам. Поэтому на него стоит обратить особое внимание.
Maximus@andreyex:~$ printf "Привет, %s! \n" Maximus Бобик Привет, Maximus! Привет, Бобик!
Точно так же вы должны обратить внимание на тип спецификатора формата, который он ожидает в строке формата.
Как вы можете видеть в приведенном выше примере, если он не находит нужные аргументы, он отображает значения по умолчанию, которые равны нулю для строк и 0 для целых чисел.
printf "Привет %s, ваша будка номер %d. \n" Maximus Бобик 131 bash: printf: Бобик: invalid number Привет Maximus, ваша будка номер 0. Привет 131, ваша будка номер 0.
Здесь он принимает Maximus Бобик как первый набор аргументов, так и 131 второй набор аргументов.
Когда он находит строку (Бобик) вместо целого числа, он жалуется, но продолжает отображать вывод со вторым аргументом со значением по умолчанию 0.
Точно так же он видит 131 как строку во втором наборе аргументов, а поскольку второй аргумент отсутствует, по умолчанию он равен 0.
Для отображения вывода в желаемом формате доступно несколько спецификаторов формата. Вот некоторые из самых распространенных:
символ | Применение |
---|---|
%s | Строка |
%c | Одиночный персонаж |
%d | Целые числа |
%o | Восьмеричные целые числа |
%x | Шестнадцатеричные целые числа |
%f | Плавающая точка |
%b | Строка с escape-символом обратной косой черты |
%% | Знак процента |
Теперь, когда вы знакомы со спецификатором формата, давайте рассмотрим еще несколько примеров, демонстрирующих их в действии.
Мы не думаем, что вам нужно подробное объяснение большинства этих примеров, поскольку они не требуют пояснений.
Maximus@andreyex:~$ printf "Восьмеричное значение %d is %o\n" 30 30 Восьмеричное значение 30 is 36
Давайте посмотрим, как использовать спецификатор %b для правильной интерпретации экранированного символа обратной косой черты.
Maximus@andreyex:~$ printf "Строка с обратной косой чертой: %s\n" "Hello\nWorld!" Строка с обратной косой чертой: Hello\nWorld!
Как видите %s, это не имеет значения. Но %b с новой строкой escape-символ будет правильно интерпретирован:
Maximus@andreyex:~$ printf "Строка с обратной косой чертой: %b\n" "Hello\nWorld!" Строка с обратной косой чертой: Hello World!
Когда вы используете %c, он читает только символ за раз.
Maximus@andreyex:~$ printf "Символ: %c\n" a Символ: a Maximus@andreyex:~$ printf "Символ: %c\n" a b c Символ: a Символ: b Символ: c Maximus@andreyex:~$ printf "Символ: %c\n" abc Символ: a
Есть модификаторы, чтобы изменить внешний вид вывода по своему вкусу.
Ранее вы видели использование %oдля преобразования десятичного числа в восьмеричное. Однако было не совсем ясно, что это восьмеричное число. Вы можете использовать #модификатор для отображения восьмеричных и шестнадцатеричных чисел в правильном формате.
Maximus@andreyex:~$ printf "%d is %#o в восьмеричном и %#x в шестнадцатеричном формате\n" 30 30 30 30 is 036 в восьмеричном и 0x1e в шестнадцатеричном формате
Вы можете использовать пробел между %и d внутри %d для отображения положительного целого числа с начальным пробелом. Это помогает, когда у вас есть столбец положительных и отрицательных чисел. Посмотрите, какой из них выглядит более симпатичнее:
Maximus@andreyex:~$ printf "%d \n%d \n%d \n" 10 -10 10 10 -10 10 Maximus@andreyex:~$ printf "% d \n%d \n% d \n" 10 -10 10 10 -10 10
Модификатор ширины – это целое число, указывающее минимальную ширину поля аргумента.
По умолчанию он выровнен по правому краю:
Maximus@andreyex:~$ printf "%10s| %5d\n" Age 23 Age| 23
Вы можете выровнять его по левому краю, добавив -к нему флаг:
Maximus@andreyex:~$ printf "%-10s| %-5d\n" Age 23 Age | 23
Вы можете использовать прецизионный модификатор (.) Точки , чтобы определить минимальное количество цифр , которое будет отображаться с %d, %u, %o, %x. Он добавляет нулевое заполнение слева от значения.
Maximus@andreyex:~$ printf "Roll Number: %.5d\n" 23 Roll Number: 00023
Если вы используете модификатор точности со строкой, он указывает максимальную длину строки. Если строка длиннее, на дисплее она обрезается.
Maximus@andreyex:~$ printf "Имя: %.4s\n" Maximus Имя: Alex
Вы можете комбинировать модификатор ширины и точности:
Maximus@andreyex:~$ printf "Имя: %.4s\n" Maximus Имя: Alex Maximus@andreyex:~$ printf "Имя: %10.4s\n" Maximus Имя: Alex
Давайте применим то, что вы узнали о команде printf, на более сложном примере. Это продемонстрирует истинный потенциал команды printf в сценариях bash.
Давайте воспользуемся командой printf, чтобы распечатать следующую таблицу с помощью bash:
Имя | ID | Возраст | Оценки |
---|---|---|---|
Sherlock Holmes | 0000122 | 23 | A |
James Bond | 0000007 | 27 | F |
Hercules Poirot | 0006811 | 59 | G |
Jane Marple | 1234567 | 71 | C |
Вот сценарий оболочки, который мы написали для этой задачи. Ваш сценарий может отличаться:
#/bin/bash seperator=-------------------- seperator=$seperator$seperator rows="%-15s| %.7d| %3d| %c\n" TableWidth=37 printf "%-15s| %-7s| %.3s| %s\n" Name ID Age Grades printf "%.${TableWidth}s\n" "$seperator" printf "$rows" "Sherlock Holmes" 122 23 A printf "$rows" "James Bond" 7 27 F printf "$rows" "Hercules Poirot" 6811 59 G printf "$rows" "Jane Marple" 1234567 71 C
Разве не чудесно использовать команду printf в bash для печати красиво отформатированного вывода для ваших сценариев?
Надеюсь, вам понравилось это подробное руководство по команде printf в Linux. Если у вас есть вопросы или предложения, дайте мне знать.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Автор ArseniyDV На чтение 7 мин Просмотров 513 Опубликовано
Printf c — так называют особое семейство, включающее в себя функции и методики, причисленные к коммерческим библиотекам. Они достаточно широко известны и относятся к категории стандартных.
Так обозначают встроенные операторы для отдельных языков, применимых в сфере программирования и традиционно использующихся в целью форматного вывода под различные потоки и типы. Форматирование здесь происходит по специально разработанному, заданному заранее шаблону. Его можно определить, как особую информацию строкой, которая составляется по надлежащим правилам.
Она выступает ключевым представителем семейства, которая по совместительству считается наиболее яркой. Есть и другие функции, которые применяются в стандартной библиотеке языка C. Операционки типа unix предполагают также применение утилиты. Принцип выступает для тех же целей форматного вывода.
Формат представляет собой ранний прототип данной функции. Он принадлежит к языку Фортран. Под управлением строки формируется функция вывода, появившаяся в языках, считавшихся предшественниками языка C. Обратившись к стандартной библиотеке и ее спецификации, можно увидеть то, что ей присущ наиболее известный вид. У него имеется особый размер, ширина, точность.
Такое форматирование в последующие годы стали применять одновременно с прочими языками программирования. Их вариации находили применение, чтобы можно было использовать их в приспособленном варианте под особенности языков. Соответствующие функции таких языков обычно носят наименование print f. Либо их называют производными от него.
Отдельные виды программирования, такие как .NET применяют концепцию вывода. Она управляется под влиянием форматной строки, но с использованием каких-то прочих типов синтаксиса.
У Fortran 1 присутствовали операторы, за счет которых можно было обеспечивать форматный вывод. Синтаксис под руководством операторов write и print предполагает особую метку, которая отсылает к оператору формат, который называется неисполняемым. Он содержит специальную информацию спецификацию.
Спецификатор представляет собой часть синтаксиса оператора. Вот почему можно сформировать компилятором код. Он будет представлять собой выполняющий форматирование данных объект. Такой инструмент гарантировал оптимальную производительность на агрегатах, актуальных в то время. Но у них имелся ряд недостатков, среди которых можно было обнаружить:
Впервые прототип у функции Print F появился в шестидесятых годах прошлого века в языке BCPL. Функция WRITEF отвечает за принятие строки форматирования, где тип данных принято указывать по отдельности от самих информационных сведений и отделять переменной. Ключевой целью формирования такой строки выступала передача тех компонентов.
Дело в том, чтобы в языках программирования, имеющих статическую типизацию, определение типа переданного впоследствии аргумента для функции с фиксированным перечнем формальных показателей необходим сложный механизм передачи сведения о типах, которые являются неэффективными для общего случая.
Функция WRITEF применялось, в качестве инструмента для более сокращённого вывода, то есть помимо набора функций для вывода символа из строки, применялся единый вызов, где удавалось чередовать стандартный текст с другими значениями.
В 1969 году появился язык Би. Он предполагал использование printf с аналогичной BCPL, но более простой строкой форматирования. Здесь указывался только один из возможных вариантов типов и два способа представления числа. К ним относились десятичные и восьмеричные, кроме того, этот список включал символы, строки.
Единственной на тот момент возможностью отформатировать вывод в рассматриваемых функциях выступало прибавление символики до и после вывода назначения рассматриваемой переменной.
В 1970 году, когда появился самый первый вариант языка Си, рассматриваемое семейство превратилось в ключевое средство форматного вывода. Разбирать форматную строку и затрачивать на это силы показалось приемлемым для создателей. Вот почему альтернативный вызов для любого типа по отдельности в библиотеку внедрять не планировали.
Спецификации функции стали использоваться в существующих на тот момент стандартах языка, которые появились, соответственно, в 90 и 99 годах прошлого века. Последняя спецификация представляет ряд нововведений относительно спецификаций девяностого года.
Язык Си++ задействует стандартную библиотеку Си, которая соответствует параметрам девяностого года, в том числе всё семейство Принт Ф. Вариантом стандартной библиотеки, альтернативой в данном случае выступает набор классов потокового ввода и вывода. Операторы, работающие с такой библиотекой, считаются безопасными.
Соответственно, им не требуется какого-либо разбора формата данных строк, когда необходимо сделать вызов всякий раз. Как бы там ни было, большинство программистов и сегодня пользуются семейством printex, потому что запись последовательности вывода обычно представляется компактнее. Суть формата, применяемого при этом, считается более ясной.
Символ звёздочка, который указывает на ширину, также этот объект идентифицируется, как десятичное число, указывает на минимальный показатель ширины поля. В этот показатель входит и знак чисел. Если представление величины считается большим, то запись обычно оказываются за пределами поля.
Пример: если представление величины оказывается меньше указанного числа, то по умолчанию его следует заполнять пробелами с левой области. Поведение при этом может сменяться флагами, предшествующими им. Иногда в этой роли указывается звездочка.
В таком случае ширина поля здесь обозначается в перечне аргументов. Находится она перед параметром для вывода.
Его также называют модификатором и указывает он на минимальный показатель символов, которые обязаны появляться во время обработки типов, таких как d, i, o, u, x, X. Модификатор точности призван оказывать минимальное количество символов, которые могут формироваться после десятичной запятой, то есть с точки. Происходит это во время обработки таких типов, к которым причисляются a, A, e, E, f, F.
Максимально допустимый объем значащих символов и максимальное число символов, которые актуальны для типа C. Он сформируется, задаваясь в форме точки с дальнейшим десятичным числом либо звёздочка также может отсутствовать. В этом случае предполагается, что число соответствует нулевому.
Можно задействовать точку и в таких ситуациях, когда при выводе чисел с плавающей запятой указывается запятая.
Модификатор размера, который указывается в специальном поле, показывает определенный размер данных, который передается непосредственно функции. Это поле является необходимым, и объясняется это тем, что произвольное количество параметров, передающиеся в языке Си, имеет свои особенности.
Дело в том, что самостоятельное определение типа и размера данных сведений, в соответствии с этой функцией, невозможно. Вот почему информацию о параметрах и их типах, как и о точном размере, должна передаваться предельно четко.
К семейству, о котором ведется речь, посредством своих функций применяется список аргументов. Можно указывать в качестве отдельного параметра особенности их размера. Для этого существует строка форматирования. Если она не соответствует переданному аргументу, поведение может быть непредсказуемым.
Становится вероятными повреждение стека, произвольного кода, который выполняется. Функции семейства можно считать небезопасными, потому что у них не имеется теоретической основы для корректной защиты данных.
Семейство C не предполагает использования каких-либо значимых ограничителей касаемо максимального параметра размера записываемой строки. Соответственно, здесь становится возможной ошибка переполнения буфера. Это имеет место в случае, когда из-за неправильных действий данные записываются за пределы той области памяти, которая выделена специально для этих манипуляций.
Такое поведение может иметь место, если имеется несоответствие строки? Необходимо в данном случае обратиться к соглашению о вызове стека. Если осуществлять вызов printf, то указывающие на аргумент объекты автоматически переходят в порядке следования записи направлении слева направо.
По мере того, как строки форматирования будут обрабатывать, рассматриваемая функция будет учитывать имеющиеся аргументы непосредственно со стека.
Бывает и так, что количество аргументов становится чрезмерным. В такой ситуации printf в отношении требующихся для обработки и форматирования аргументов возобновляет управление этой функцией. Функция, в сопоставлении со спецификацией, способна очистить область стека от параметров, переданных в нее.
В такой ситуации любые лишние параметры не будут использованы, тогда как программа продолжит функционировать в привычном для неё режиме.
Когда функция printf вызвана, но все-таки оказывается меньше аргументов, нежели изначально требовалось с целью обработки строки форматирования, то происходит следующее. Производится считывание недостающих аргументов, невзирая на то, что на стыке расположены произвольные информационные данные.
Они не имеют отношения к рассматриваемой в этой статье функции. В случае, если обработка информационных данных произошла удачно, то есть программа не перестала функционировать, не продемонстрировала зависание и прочее, после возвращения в функцию вызова показатель стека примет исходное значение. Соответственно, программное обеспечение продолжит стандартную работу.
Эта команда была создана для замены всем знакомой команды echo. Возможности команды echo ограничены, кроме того, в разных ветках Unix’а оказались разные ее версии, что приводит к несовместимости. Поэтому Posix рекомендует пользоваться командой printf. Команда printf выводит АРГУМЕНТ на стандартный вывод (как правило, экран дисплея), используя при этом определенный ФОРМАТ.
printf 'ФОРМАТ' 'АРГУМЕНТ'
Эта команда была создана для замены всем знакомой команды echo (настолько древней, что даже имя ее автора не известно).
Самое первое, что следует прояснить: по умолчанию команда printf не переводит строку по завершении. Это выглядит так:
[ya@antony ~]$ printf '%s' 'alex' alex[ya@antony ~]$
Следующее приглашение командной строки находится на той же самой строке что и вывод предыдущей команды. Это очень неудобно, поэтому в ФОРМАТ приходится добавлять символ новой строки (\n):
[ya@antony ~]$ printf '%s\n' 'alex' alex [ya@antony ~]$
Приглашение переехало на новую строку, и все обрело привычный вид. В дальнейшем я не стану приводить приглашение целиком, ограничусь знаком доллара.
Вот как выглядит команда printf в виде, полностью дублирующем команду echo:
$ printf '%b\n' 'Это заклинание заменит команду echo' Это заклинание заменит команду echo
Обратите внимание, что мы взяли аргумент в кавычки, чтобы получить его в виде одной строки. Если бы мы этого не сделали, то имели бы столбик, так как программа воспринимает выражения, разделенные пробелом, как множественные аргументы, и обрабатывает каждый в соответствии с заданным форматом:
$ printf '%b\n' Это заклинание заменит команду echo Это заклинание заменит команду echo
Если нам нужно использовать команду printf для просмотра переменных окружения, то кавычки не нужны:
$ printf '%b\n' $PATH /home/ya/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin:/usr/games:/usr/X11R6/bin
Если же мы возьмем аргумент в кавычки, то он будет воспринят просто как выражение и воспроизведен дословно:
$ printf '%b\n' '$PATH' $PATH
Но довольно о замене команды echo, займемся непосредственно командой printf.
N Нормальное десятичное число. Например 177
0N Восьмеричное число. Например 024.
0xN и 0XN Шестнадцатеричные числа. Например 0?41.
«А (обычные кавычки перед любой буквой) Интерпретируется как кодовый номер этой буквы в текущей кодировке. С кириллицей не работает.
‘А (одинарные кавычки перед любой буквой) Интерпретируется как кодовый номер этой буквы в текущей кодировке. С кириллицей не работает.
Вообще говоря, синтаксис команды printf взят от функции printf() языка программирования Си (и еще дюжины других). Но далеко не все знакомы с Си, поэтому мы внимательно рассмотрим все тонкости синтаксиса этой команды.
ФОРМАТ пишется в командной строке непосредственно после самой команды и заключается в кавычки — двойные или одинарные. Собственно говоря, кавычки нужны не всегда, но лучше их ставить, во избежание недоразумений. Это полезная привычка. (А ведь большинство привычек — вредные).
%b Рассматривает аргумент как строку, при этом интерпретирует все управляющие символы, содержащиеся в ней.
%s Рассматривает аргумент как просто как строку.
%c Рассматривает аргумент как символ, при этом берется первый символ выражения или строки.
%q Преобразует строку к виду, пригодному к использованию в качестве ввода в шелл.
Здесь необходимы пояснения. Допустим, мы хотим напечатать на экране фразу:
Ваш, Алексей Дмитриев
Для этого дадим следующую команду:
$ printf '%b\n' 'Ваш,\nАлексей Дмитриев' Ваш, Алексей Дмитриев
А теперь вместо формата %b применим формат %q:
$ printf '%q\n' 'Ваш,\nАлексей Дмитриев' $'\320\222\320\260\321\210,\\n\320\220\320\273\320\265\320\272\321\201\320\265\320\271 \320\224\320\274\320\270\321\202\321\200\320\270\320\265\320\262'
Кажется, произошла какая-то ошибка или сбой. Но это не так; подставим вывод команды в качестве аргумента команды printf ‘%b\n’, но уже безо всяких дополнительных кавычек (все необходимые кавычки содержатся в выводе команды):
$ printf '%b\n' $'\320\222\320\260\321\210,\\n\320\220\320\273\320\265\320\272\321\201\320\265\320\271 \320\224\320\274\320\270\321\202\321\200\320\270\320\265\320\262' Ваш, Алексей Дмитриев
Больше того, этот же вывод можно использовать в качестве аргумента для других команд, скажем echo -e (опция -e позволяет команде echo интерпретировать специальные символы, в частности символ новой строки (\n):
$ echo -e $'\320\222\320\260\321\210, \\n\320\220\320\273\320\265\320\272\321\201\320\265\320\271 \320\224\320\274\320\270\321\202\321\200\320\270\320\265\320\262' Ваш, Алексей Дмитриев
Вот какой интересный формат %q! Однако продолжим.
Дальше идут всевозможные форматы представления чисел.
%d Представляет аргумент в виде десятичного числа, могущего иметь знак (+ или -).
%u Представляет аргумент в виде десятичного числа, не имеющего знака.
$ printf '%d\n' -777 -777
%i То же, что и предыдущее.
%o Представляет аргумент в виде не имеющего знака восьмеричного числа.
$ printf '%o\n' 777 1411
%x Представляет аргумент в виде не имеющего знака шестнадцатеричного числа. Буквы пишутся в нижнем регистре.
$ printf '%x\n' 177 b1
%X Представляет аргумент в виде не имеющего знака шестнадцатеричного числа, при этом буквы пишутся в верхнем регистре.
$ printf '%X\n' 177 B1
%f Интерпретирует аргумент как число с плавающей запятой.
$ printf '%f\n' 17,7 17,700000
%e Интерпретирует аргумент с удвоенной точностью (double precision), при этом выводит его в формате <N>+/-e<N>.
$ printf '%e\n' 177 1,770000e+02
%E То же, что и предыдущее, только с заглавной буквой Е.
Вот и все форматы, я привел их для встроенной в bash команды printf.
Для большей гибкости представления строк или чисел, поддерживаются несколько модификаторов форматов. Модификаторы вставляются между символом процента и буквой, характеризующей формат, например:
[ya@antony ~]$ printf '%50s\n' 'this field is 50 characters wide...' this field is 50 characters wide...
(С кириллицей не работает).
Модификаторы: Любое число Обозначает минимальную ширину колонки, если текст короче, то строки дополняются пробелами. (См. пример выше).
— Выравнивание текста по левому краю (стандарно — по правому краю)
0 Дополняет числа нулями, а не пробелами. Применяется при заданной ширине колонки (в примере 50). Пример:
$ printf '%050d\n' '177' 00000000000000000000000000000000000000000000000177
space Дополняет положительные числа пробелами, а отрицательные знаками «минус» (-).
+ Пишет все числа со знаками плюс или минус.
%#o Восьмеричные числа пишутся с нулем впереди, если они сами не нулевые:
$ printf '%#0o\n' '177' 0261
%#x, %#X Шестнадцатеричные числа пишутся с 0х или 0Х впереди, если они сами не нулевые:
$ printf '%#x\n' '177' 0xb1
%#g, %#G Числа с плавающей запятой пишутся с последующими нулями, в количестве, определяемом данным разрешением. Обычно последующие нули не пишутся:
$ printf '%#g\n' '17,7' 17,7000
%# со всеми числовыми форматами, кроме d, o, x, X Всегда ставит десятичную запятую, даже если знаков после запятой нет:
$ printf '%#ge\n' '177' 177,000
Точность разрешения чисел с плавающей запятой и чисел с удвоенной точностью (double precision) можно регулировать следующим образом:
$ printf "%.20f\n" 4,3 4,30000000000000000017
Внимание: не прозевайте точку в записи формата!
Можно вместо числа знаков поставить астериск, тогда количество знаков ставится перед самим аргументом:
$ printf "%.*f\n" 10 4,3 4,3000000000
Для строк точность разрешения определяет максимальное число выводимых символов (максимальную ширину колонки текста).
Для целых чисел — задает число выводимых знаков (добавляет нули).
\» Двойные кавычки
\NNN Символ с восьмеричным значением NNN (от 1 до 3 цифр)
\\ Обратный слэш (\)
\a Звуковой сигнал
\b Забой
\c Не производить дальнейшую обработку данных
\f Перевод страницы
\n Новая строка
\r Возврат каретки
\v Вертикальная табуляция
\xHH Символ с шестнадцатеричным кодом HH (1 или 2 цифры)
\uHHHH Символ Unicode (ISO/IEC 10646) с шестнадцатеричным кодом HHHH (4 цифры)
\UHHHHHHHH Символ Unicode с шестнадцатеричным кодом HHHHHHHH (8 цифр)
%% Символ %
1. Вывести шестнадцатеричное число в десятичной форме:
$ printf '%d\n' '-0x41' -65
2. Вывести десятичное число в восьмеричной форме:
$ printf '%o\n' 65 101
3. Узнать кодовый номер буквы А (англ):
$ printf '%d\n' \'A 65
4. Пример, служащий домашним заданием:
$ printf '%b\n' "$0" "$@" /bin/bash
Кто понял, в чем тут дело, сообщите мне, пожалуйста. Я лично не понял.
Опция -v ПЕРЕМЕННАЯ_ОКРУЖЕНИЯ
Записывает аргумент в указанную переменную окружения. При этом затирает все, что там было прописано. Осторожно!
$ printf -v PATH '%b\n' '/usr/local/bin' $ printf '%b\n' $PATH /usr/local/bin $ su bash: su: команда не найдена
Хорошо, что в начале статьи я привел пример, в котором была записана моя $PATH, поэтому смог восстановить.
Опции —help и —version общеизвестны и рассмотрены не будут.
Примечание: В мане GNU-версии команды вы не найдете и половины этой информации, а будете отосланы к синтаксису языка Си.
Исследуя подобные команды, получаешь настоящее удовольствие, маны практически отсутствуют, найденные статьи относятся к другим версиям команды. Почти все приходится добывать методом эксперимента. Сколько еще удивительных особенностей таит команда printf, узнают только те, кто станет пользоваться ей в повседневной жизни.
Должен предупредить, что собрал в этой статье все, что сумел «нарыть» по поводу всех версий этой команды. Поэтому некоторые варианты могут не срабатывать в ваших версиях.
open-club.ru
Иногда (а точнее, довольно часто) возникают ситуации, когда нужно сделать строку, подставив в неё некоторые данные, полученные в процессе выполнения программы (пользовательский ввод, данные из файлов и т. д.). Подстановку данных можно сделать с помощью форматирования строк. Форматирование можно сделать с помощью оператора %, либо с помощью метода format.
Если для подстановки требуется только один аргумент, то значение — сам аргумент:
>>> 'Hello, {}!'.format('Vasya') 'Hello, Vasya!'
А если несколько, то значениями будут являться все аргументы со строками подстановки (обычных или именованных):
>>> '{0}, {1}, {2}'.format('a', 'b', 'c') 'a, b, c' >>> '{}, {}, {}'.format('a', 'b', 'c') 'a, b, c' >>> '{2}, {1}, {0}'.format('a', 'b', 'c') 'c, b, a' >>> '{2}, {1}, {0}'.format(*'abc') 'c, b, a' >>> '{0}{1}{0}'.format('abra', 'cad') 'abracadabra' >>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W') 'Coordinates: 37.24N, -115.81W' >>> coord = {'latitude': '37.24N', 'longitude': '-115.81W'} >>> 'Coordinates: {latitude}, {longitude}'.format(**coord) 'Coordinates: 37.24N, -115.81W'
Однако метод format умеет большее. Вот его синтаксис:
поле замены ::= "{" [имя поля] ["!" преобразование] [":" спецификация] "}" имя поля ::= arg_name (".'Выравнивание по центру. Опция "знак" используется только для чисел и может принимать следующие значения:
Флаг | Значение |
'+' | Знак должен быть использован для всех чисел. |
'-' | '-' для отрицательных, ничего для положительных. |
'Пробел' | '-' для отрицательных, пробел для положительных. |
Поле "тип" может принимать следующие значения:
Тип | Значение |
'd', 'i', 'u' | Десятичное число. |
'o' | Число в восьмеричной системе счисления. |
'x' | Число в шестнадцатеричной системе счисления (буквы в нижнем регистре). |
'X' | Число в шестнадцатеричной системе счисления (буквы в верхнем регистре). |
'e' | Число с плавающей точкой с экспонентой (экспонента в нижнем регистре). |
'E' | Число с плавающей точкой с экспонентой (экспонента в верхнем регистре). |
'f', 'F' | Число с плавающей точкой (обычный формат). |
'g' | Число с плавающей точкой. с экспонентой (экспонента в нижнем регистре), если она меньше, чем -4 или точности, иначе обычный формат. |
'G' | Число с плавающей точкой. с экспонентой (экспонента в верхнем регистре), если она меньше, чем -4 или точности, иначе обычный формат. |
'c' | Символ (строка из одного символа или число - код символа). |
's' | Строка. |
'%' | Число умножается на 100, отображается число с плавающей точкой, а за ним знак %. |
И напоследок, несколько примеров:
>>> coord = (3, 5) >>> 'X: {0[0]}; Y: {0[1]}'.format(coord) 'X: 3; Y: 5' >>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2') "repr() shows quotes: 'test1'; str() doesn't: test2" >>> '{:<30}'.30}'.format('centered') # use '*' as a fill char '***********centered***********' >>> '{:+f}; {:+f}'.format(3.14, -3.14) # show it always '+3.140000; -3.140000' >>> '{: f}; {: f}'.format(3.14, -3.14) # show a space for positive numbers ' 3.140000; -3.140000' >>> '{:-f}; {:-f}'.format(3.14, -3.14) # show only the minus -- same as '{:f}; {:f}' '3.140000; -3.140000' >>> # format also supports binary numbers >>> "int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}".format(42) 'int: 42; hex: 2a; oct: 52; bin: 101010' >>> # with 0x, 0o, or 0b as prefix: >>> "int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(42) 'int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010' >>> points = 19.5 >>> total = 22 >>> 'Correct answers: {:.2%}'.format(points/total) 'Correct answers: 88.64%'
Коды формата C printf
Коды формата C printf определяют способ передачи данных с использованием формата, аналогичного формату функции printf C.
Используйте стиль printf C, чтобы распечатать шесть чисел в фигурных скобках:
PRINT, INDGEN (3), FORMAT = 'Значения: {% d} {% d} {% d}'
отпечатков IDL:
Значения: {0} {1} {2}
Синтаксис кода формата C printf:
% [-] [0] [ширина] C
Где:
отмечает начало кода формата. | |
– | необязательный, задает выравнивание выходного аргумента по левому краю. |
0 | необязательно, добавляет нулевое заполнение слева, чтобы соответствовать ширине. |
ширина | необязательная спецификация ширины.Спецификации ширины и значения по умолчанию зависят от кода формата и описываются кодами формата ниже. |
С | - это код формата. См. ниже. |
В следующей таблице перечислены коды формата%, разрешенные в коде формата строки в кавычках в стиле printf, а также их соответствие кодам стандартного формата, которые делают то же самое.В дополнение к кодам формата, описанным в таблице, специальная последовательность %% приводит к тому, что на выходе записывается один символ%. Этот% рассматривается как обычный символ, а не как спецификатор кода формата. Наконец, флаги и параметры заполнения ширины, описанные в разделе «Синтаксис», также доступны при использовании кодов формата в стиле printf.
Printf-Style | Описание |
%% | Вставьте один символ%. |
% b,% B % w b,% w B % w.m b,% w.m B | Передача данных в двоичной системе счисления, w - общая ширина, м - минимальное количество непустых цифр.Нет никакой разницы между строчными и прописными буквами. |
% d,% D % w d,% w D % w.m d,% w.m D % i,% I % w i,% w I % мас.m i,% w.m I | Передача целочисленных данных, w - общая ширина, м - минимальное количество непустых цифр. Нет никакой разницы между строчными и прописными буквами. Формы% d идентичны формам% i и предназначены для программистов, знакомых с printf языка Си. |
% e,% E % w e,% w E % мас.d e,% w.d E | Передача данных в экспоненциальном представлении, w - общая ширина, d - количество цифр после десятичной дроби. В зависимости от кода будет использоваться строчная буква «е» или прописная буква «E». |
% f,% F % w f,% w F % мас.d f,% w.d F | Передача данных в формате с плавающей запятой, w - общая ширина, d - количество цифр после десятичной дроби. Нет никакой разницы между строчными и прописными буквами. |
9000 2% г,% G % w г,% w G % мас.d г,% w.d G | Передача данных в формате с плавающей запятой или экспоненциальной записи, w - общая ширина, d - общее количество значащих цифр. Используйте% e или% E, если показатель степени меньше –4 или больше или равен точности, в противном случае используйте% f. |
% o,% O % w o,% w O % мас.м o,% вм O | Передача данных в восьмеричной системе счисления, w - общая ширина, м - минимальное количество непустых цифр. Нет никакой разницы между строчными и прописными буквами. |
% s,% S % w s,% w S | Передавать символьные данные до тех пор, пока не будет достигнут нулевой байт (\ 0) или общая ширина w . |
% x,% X % w x,% w X % w.m x,% w.m X % z,% Z % w z,% w Z % w.m z,% w.m Z | Передача данных в шестнадцатеричной системе счисления, w - общая ширина, м - минимальное количество непустых цифр.% X или% z в нижнем регистре соответствует шестнадцатеричным цифрам в нижнем регистре, а% X или% Z в верхнем регистре - в верхнем регистре. |
IDL поддерживает следующие «escape-последовательности» в строке формата:
Последовательность побега | код ASCII |
\ а, \ а | БЕЛ (7Б) |
\ б, \ б | Backspace (8B) |
\ f, \ F | Подача формы (12B) |
\ n, \ N | Перевод строки (10B) |
\ r, \ R | Возврат каретки (13B) |
\ т, \ т | Горизонтальный выступ (9B) |
\ v, \ V | Вертикальный выступ (11B) |
\ ooo | Восьмеричное значение ooo (Восьмеричное значение из 1-3 цифр) |
\ xhh | Шестнадцатеричное значение hh (шестнадцатеричное значение, 1-2 цифры) |
Примечание: Если символу, не указанному в этой таблице, предшествует обратная косая черта, обратная косая черта удаляется, и символ вставляется без какой-либо специальной интерпретации.Например, вы можете использовать \% для вставки символа процента или \ "для вставки символа двойной кавычки.
Форматы печати · Функции печати · Спецификаторы преобразования печати
Несколько библиотечных функций помогут вам преобразовать значения данных из
закодированные внутренние представления текстовых последовательностей, которые
в целом читается людьми.Вы предоставляете
строка формата как значение формат
аргумент каждой из этих функций, следовательно
термин отформатировал вывод .
Функции делятся на две категории.
Функции печати байт (заявлено в
)
преобразовать внутренние представления в последовательности типа char, и помочь вам составить такие последовательности для отображения:
fprintf,
printf,
спринт
vfprintf,
vprintf и
vsprintf.
Для этих функций строка формата - это
многобайтовая строка
что начинается и заканчивается в
начальное состояние переключения.
Функции широкоформатной печати (заявлено в
и, следовательно, добавлен с Поправка 1 )
преобразовать внутренние представления в последовательности типа wchar_t
,
и помочь вам составить такие последовательности для отображения:
fwprintf,
swprintf,
wprintf,
vfwprintf,
vswprintf и
vwprintf.
Для этих функций строка формата - это
строка расширенных символов.
В нижеследующих описаниях широкий символ wc
из строки формата или потока сравнивается с конкретным (байтом)
символ c
как если бы путем вычисления выражения wctob (туалет) == c
.
Строка формата имеет то же синтаксис как для функций печати, так и для функции сканирования, как показано на схеме.
Строка формата состоит из нуля или более
Характеристики преобразования с вкраплениями буквального текста и пустое пространство .
Пробел - это последовательность из одного или нескольких
символы c
для которых звонят isspace (c)
возвращает ненулевое значение.
(Символы, обозначенные как пробелы, могут измениться при изменении LC_CTYPE
категория локали.)
Для функций печати спецификация преобразования является одним из спецификации преобразования печати описаны ниже.
Функция печати сканирует строку формата один раз с начала.
до конца, чтобы определить, какие преобразования выполнять. Каждый отпечаток
функция принимает
различное количество
аргументов, либо напрямую, либо под управлением аргумента типа va_list
.
Некоторые спецификации преобразования печати
в строке формата используйте следующий аргумент в списке.
Функция печати использует каждый последующий аргумент не более чем
однажды.Завершающие аргументы можно не использовать.
В следующем описании:
Для функций печати буквальный текст или пустое пространство в формате строка генерирует символы, которые соответствуют символам в формате нить. А спецификация преобразования печати обычно генерирует символы путем преобразования следующего значения аргумента в соответствующую текстовую последовательность. Спецификация преобразования печати имеет формат:
.Жирный шрифт указывает на функцию, добавленную с помощью C99.
После символа процента ( %
)
в строке формата вы можете написать ноль или более
Флаги формата :
-
- для выравнивания преобразования по левому краю +
- для создания знака плюса для значений со знаком, которые
положительные пространство
- для создания пространства
для значений со знаком
не имеющие ни плюса, ни минуса #
- к префиксу 0
при преобразовании o
,
к префиксу 0x
при преобразовании x
,
к префиксу 0X
при преобразовании X
,
или для создания десятичной запятой и дроби
цифры, которые в противном случае подавляются при преобразовании с плавающей запятой 0
- дополнить преобразование ведущими нулями после
любой знак или префикс, при отсутствии минуса ( -
)
флаг формата или указанная точность После любых флагов формата вы можете написать ширина поля что
указывает минимальное количество символов, которое нужно сгенерировать для преобразования.Если не изменен флагом формата,
по умолчанию используется короткое преобразование
слева с пробелом
знаков.
Если написать звездочку ( *
)
вместо десятичного числа для ширины поля печать
функция принимает значение следующего аргумента (который должен иметь тип int ) в качестве ширины поля. Если значение аргумента отрицательное,
он предоставляет флаг формата -
а его величина - ширина поля.
После любой ширины поля вы можете написать точку ( .
)
за которым следует точность который указывает одно из следующего:
минимальное количество цифр, генерируемых при преобразовании в целое число;
количество цифр дробной части, генерируемое на e
, E
или f
преобразование;
максимальное количество значащих цифр для генерации
на преобразователе г
или G
; или максимальное количество
символов для создания из
Строка C
при преобразовании с
.
Если вы напишите *
вместо
десятичное число для точности,
функция печати принимает значение следующего аргумента (который должен
иметь тип int ) в качестве точности.Если значение аргумента
отрицательный, применяется точность по умолчанию. Если ты тоже не напишешь *
или десятичное число после точки, точность
равно нулю.
После любого точность, вы должны написать односимвольный спецификатор преобразования печати , возможно, перед ним стоит одно- или двухсимвольный квалификатор. Каждая комбинация определяет требуемый тип следующий аргумент (если есть) и как функции библиотеки изменяют аргумент значение перед преобразованием его в текстовую последовательность.Целое число и преобразования с плавающей запятой также определяют какую базу использовать для текстового представления. Если спецификатор преобразования требует точности p , и вы делаете не указывать один в формате, тогда спецификатор преобразования выбирает значение точности по умолчанию. Следующая таблица перечисляет все определенные комбинации и их свойства.
Преобразование Аргумент Преобразовано По умолчанию До Указатель Тип Значение Базовый cision % двойной x (двойной) x 10 6 добавлен с C99 % La long double x (long double) x 10 6 с добавлением C99 % Двойной x (двойной) x 10 6 добавлен с C99 % LA длинный двойной x (длинный двойной) x 10 6 с добавлением C99 % c int x (символ без знака) x % lc wint_t x wchar_t a [2] = {x} % d int x (число) x 10 1 % hd int x (короткий) x 10 1 % ld long x (длинный) x 10 1 % hhd int x (знаковый символ) x 10 1 добавлен с C99 % jd intmax_t x (intmax_t) x 10 1 добавлен с C99 % lld long long x (long long) x 10 1 с добавлением C99 % td ptrdiff_t x (ptrdiff_t) x 10 1 добавлен с C99 % zd size_t x (ptrdiff_t) x 10 1 добавлен с C99 % e двойной x (двойной) x 10 6 % Le длинный двойной x (длинный двойной) x 10 6 % E двойной x (двойной) x 10 6 % LE длинный двойной x (длинный двойной) x 10 6 % f двойной x (двойной) x 10 6 % Lf длинный двойной x (длинный двойной) x 10 6 % F double x (double) x 10 6 с добавлением C99 % LF длинный двойной x (длинный двойной) x 10 6 с добавлением C99 % г двойной x (двойной) x 10 6 % Lg длинный двойной x (длинный двойной) x 10 6 % G двойной x (двойной) x 10 6 % LG длинный двойной x (длинный двойной) x 10 6 % i int x (число) x 10 1 % hi int x (короткий) x 10 1 % li long x (длинный) x 10 1 % hhi int x (знаковый символ) x 10 1 добавлен с C99 % ji intmax_t x (intmax_t) x 10 1 добавлен с C99 % lli long long x (long long) x 10 1 с добавлением C99 % ti ptrdiff_t x (ptrdiff_t) x 10 1 добавлен с C99 % zi size_t x (ptrdiff_t) x 10 1 с добавлением C99 % n int * x % hn короткое * x % ln long * x % hhn int * x добавлено с C99 % jn intmax_t * x добавлен с C99 % lln long long * x с добавлением C99 % tn ptrdiff_t * x добавлен с C99 % zn size_t * x с добавлением C99 % o int x (целое число без знака) x 8 1 % ho int x (короткое без знака) x 8 1 % lo long x (длинный без знака) x 8 1 % hho int x (символ без знака) x 8 1 с добавлением C99 % jo intmax_t x (uintmax_t) x 8 1 добавлен с C99 % llo long long x (unsigned long long) x 8 1 с добавлением C99 % к ptrdiff_t x (size_t) x 8 1 добавлен с C99 % zo size_t x (size_t) x 8 1 с добавлением C99 % p недействительно * x (недействительно *) x % s char x [] x [0]... большой % ls wchar_t x [] x [0] ... большой % u int x (целое число без знака) x 10 1 % hu int x (короткое без знака) x 10 1 % lu long x (длинный без знака) x 10 1 % hhu int x (символ без знака) x 8 1 с добавлением C99 % ju intmax_t x (uintmax_t) x 8 1 , добавленный с C99 % llu long long x (unsigned long long) x 8 1 с добавлением C99 % tu ptrdiff_t x (size_t) x 8 1 добавлен с C99 % zu size_t x (size_t) x 8 1 с добавлением C99 % x int x (целое без знака) x 16 1 % hx int x (короткое без знака) x 16 1 % lx long x (длинный без знака) x 16 1 % hhx int x (символ без знака) x 8 1 с добавлением C99 % jx intmax_t x (uintmax_t) x 8 1 добавлен с C99 % llx long long x (unsigned long long) x 8 1 с добавлением C99 % tx ptrdiff_t x (size_t) x 8 1 добавлен с C99 % zx size_t x (size_t) x 8 1 добавлен с C99 % X int x (целое число без знака) x 16 1 % hX int x (короткое без знака) x 16 1 % lX длинное x (длинное без знака) x 16 1 % hhX int x (символ без знака) x 8 1 с добавлением C99 % jX intmax_t x (uintmax_t) x 8 1 добавлен с C99 % llX long long x (unsigned long long) x 8 1 с добавлением C99 % tX ptrdiff_t x (size_t) x 8 1 добавлен с C99 % zX size_t x (size_t) x 8 1 с добавлением C99 %% нет '%'
Спецификатор преобразования печати определяет любое поведение, не описанное в обобщенном виде. в этой таблице.Для всех преобразований с плавающей запятой:
inf
или INF
. -inf
или -INF
. nan
или NAN
. Версия верхнего регистра печатается только для спецификатора преобразования верхнего регистра,
например, % E
, но не % Lg
.
В следующих описаниях p означает точность.Примеры следуют за каждым из спецификаторов преобразования печати. Одно преобразование может генерировать до 509 символов.
Вы пишете %
или %
для создания
знаковое шестнадцатеричное дробное представление с
десятичный показатель степени двойки. Сгенерированный текст принимает форму ± 0Xh.hhhP ± dd, где ± либо плюс, либо
знак минус, X - это либо x
(для % конверсия
)
или X
(для преобразования % A
), h - шестнадцатеричная цифра, d - десятичная цифра, шестнадцатеричная точка (.)
это десятичная точка для текущего
язык
и P - это либо p
(для % преобразование
)
или P
(для преобразования % A
).
Сгенерированный текст состоит из одной целой цифры
который равен нулю только для нулевого значения,
шестнадцатеричная точка, если присутствуют какие-либо цифры дробной части
или если вы укажете #
флаг формата, не более p цифр дробной части без завершающих нулей,
и по крайней мере одна цифра экспоненты без ведущих нулей.
Результат округлен.Нулевое значение имеет нулевую экспоненту.
printf ("% a", 30.0) генерирует, например 0x1ep + 1 printf ("%. 2A", 30.0) генерирует, например 0X1.E0P + 1
Вы пишете % c
для создания одного символа из преобразованного
значение.
printf ("% c", 'a') генерирует printf ("<% 3c |% -3c>", 'a', 'b') генерирует
Для
широкий ручей,
преобразование символа x
происходит как бы при вызове btowc (x)
.
wprintf (L "% c", 'a') генерирует btowc (a)
Вы пишете % lc
для создания одного символа из преобразованного значения.
Преобразование символа x
происходит как если бы
за ним следует нулевой символ в массиве из двух элементов типа wchar_t
преобразовано по спецификации преобразования лс
.
printf ("% lc", L'a ') генерирует wprintf (L "lc", L'a ') генерирует L'a'
Вы пишете % d
, % я
, % о
, % и
, % x
, или % X
для создания
возможно целочисленное представление со знаком.% d
или % i
указывает десятичное представление со знаком, % или
беззнаковое восьмеричное, % и
беззнаковое десятичное, % x
беззнаковое шестнадцатеричное с использованием цифр 0-9
и a-f
, и % X
без знака
шестнадцатеричный с использованием цифр 0-9
и A-F
.
Преобразование генерирует не менее p цифр
для представления преобразованного значения. Если p равно нулю,
преобразованное значение нуля не генерирует никаких цифр.
printf ("% d% o% x", 31, 31, 31) генерирует 31 37 1f printf ("% hu", 0xffff) генерирует 65535 printf ("% # X% + d", 31, 31) генерирует 0X1F +31
Вы пишете % e
или % E
для создания
знаковое десятичное дробное представление с
десятичная степень десятичной экспоненты. Сгенерированный текст принимает форму ± d.dddE ± dd, где ± либо плюс, либо
знак минус, d - десятичная цифра, десятичная точка (.)
это десятичная точка для текущего
язык
а E - это либо e
(для преобразования % e
)
или E
(для преобразования % E
).
Сгенерированный текст состоит из одной целой цифры,
десятичная точка, если p не равно нулю или если вы указываете #
флаг формата, p разрядов дробной части и не менее двух разрядов экспоненты.
Результат округлен. Нулевое значение имеет нулевую экспоненту.
printf ("% e", 31.4) генерирует 3.140000e + 01 printf ("%. 2E", 31.4) генерирует 3.14E + 01
Вы пишете % f
или % F
для генерации дробно-десятичного представления со знаком
без экспоненты. Сгенерированный текст имеет вид ± d.ddd, где ± - знак плюс или минус, d - десятичная цифра, а десятичная точка (. )
это десятичная точка для текущего
локаль.
Сгенерированный текст содержит как минимум одну целую цифру,
десятичная точка, если p не равно нулю или если вы укажете
флаг формата #
и цифры дробной части p .Результат округлен.
printf ("% f", 31.4) генерирует 31.400000 printf ("%. 0f% #. 0f", 31.0, 31.0) генерирует 31 31.
Вы пишете % g
или % G
для создания
знаковая десятичная дробная дробь
представление с десятичной степенью десятичной экспоненты или без нее, в зависимости от случая.
Для преобразования % g
сгенерированный текст
принимает ту же форму, что и % e
или % от
конверсии.Для преобразования % G
,
он принимает ту же форму, что и % E
или % F
конверсия.
Точность p определяет число
значащих цифр. (Если p равен нулю, он изменяется
к 1.) Если %, то преобразование
даст показатель степени в диапазоне
[-4, p ), то вместо этого происходит преобразование % f
.
Сгенерированный текст не имеет завершающих нулей.
в любой дроби и имеет десятичную точку
только если есть ненулевые цифры дробной части, если вы не укажете #
флаг формата.
printf ("%. 6g", 31,4) генерирует 31,4 printf ("%. 1g", 31.4) генерирует 3.14e + 01
Вы пишете % n
для хранения количества сгенерированных символов
(до этого момента в формате) в целочисленном объекте
адрес которого является значением следующего последовательного аргумента.
printf ("abc% n", & x) магазинов 3
Вы пишете % p
для генерации внешнего представления указателя на void. Преобразование определяется реализацией.
printf ("% p", (void *) & x) генерирует, например F4C0
Вы пишете % s
для генерации последовательности символов из
значения, хранящиеся в аргументе
Строка C.
printf ("% s", "hello") генерирует привет printf ("%. 2s", "hello") генерирует he
Для
широкий поток, преобразование
происходит, как если бы при многократном звонке mbrtowc
,
начиная с начальное состояние преобразования.Преобразование генерирует не более p символов,
до завершающего нулевого символа, но не включая его.
wprintf (L "% s", "hello") генерирует привет
Вы пишете % ls
для генерации последовательности символов из
значения, хранящиеся в аргументе
строка расширенных символов.
Для байтового потока
преобразование происходит, как если бы при повторном вызове wcrtomb
, начиная с начальное состояние преобразования,
при условии, что могут быть сгенерированы полные многобайтовые символы.Конверсия генерирует не более p символа, до завершающего нуля, но не включая его
персонаж.
printf ("% ls", L "hello") генерирует привет wprintf (L "%. 2s", L "hello") генерирует he
Вы пишете %%
, чтобы сгенерировать
символ процента (%
).
printf ("%%") генерирует%
См. Также Содержание и Индекс .
Авторские права © 1989-2002 гг. Плаугера и Джима Броди. Все права защищены.
% | Буквальный символ процента. Никаких аргументов не требуется. |
б | Аргумент рассматривается как целое число и представляется как двоичное число. |
в | Аргумент рассматривается как целое число и представляется как символ с этим ASCII. |
д | Аргумент рассматривается как целое число и представляется как (знаковое) десятичное число. |
e | Аргумент рассматривается как научная запись (например, 1.2e + 2). |
E | Подобен спецификатору e , но использует
прописная буква (например, 1.2E + 2). |
f | Аргумент рассматривается как плавающий и представляется как число с плавающей запятой (с учетом региональных настроек). |
Ф. | Аргумент рассматривается как плавающий и представляется как число с плавающей запятой (без учета региональных настроек). |
г | Общий формат. Пусть P равно точности, если она не равна нулю, 6, если точность опущена, или 1, если точность равна нулю. Затем, если преобразование со стилем E будет иметь показатель степени X: Если P> X ≥ −4, преобразование выполняется со стилем f и точностью P - (X + 1).В противном случае преобразование выполняется со стилем e и точностью P - 1. |
G | Подобен спецификатору g , но использует E и f . |
ч | Подобен спецификатору g , но использует F .
Доступно с PHP 8.0.0. |
H | Подобен спецификатору g , но использует E и F .Доступно с PHP 8.0.0. |
o | Аргумент рассматривается как целое число и представляется как восьмеричное число. |
с | Аргумент обрабатывается и представляется в виде строки. |
u | Аргумент рассматривается как целое число и представляется как десятичное число без знака. |
x | Аргумент рассматривается как целое число и представляется как шестнадцатеричное число (строчными буквами). |
X | Аргумент рассматривается как целое число и представляется как шестнадцатеричное число (с прописными буквами). |
Когда я начал изучать Unix, я довольно рано познакомился с командой echo
.Точно так же мой начальный урок Python включал функцию print
. Знакомство с C ++ и Java познакомило меня с cout
и systemout
. Казалось, что каждый язык с гордостью имеет удобный однострочный метод вывода и рекламирует его, как будто он выходит из моды.
printf
, загадочную, загадочную и удивительно гибкую функцию. Вопреки загадочной традиции сокрытия printf
от новичков, эта статья призвана познакомить мир со скромной функцией printf
и объяснить, как ее можно использовать практически на любом языке. Термин printf
означает «форматированный для печати» и, возможно, впервые появился в языке программирования Algol 68. С момента включения в C, printf
был переопределен в C ++, Java, Bash, PHP и, вполне вероятно, на любом из ваших любимых (пост-C) языков.
Он явно популярен, но все же многие люди считают его синтаксис сложным, особенно по сравнению с такими альтернативами, как echo
или print
или cout
.Например, вот простой оператор эха в Bash:
Вот тот же результат с использованием printf
в Bash:
$ printf "% s \ n" привет
привет
$
Но вы получаете множество функций для этой дополнительной сложности, и именно поэтому printf
стоит изучить.
Основная концепция printf
заключается в возможности форматирования вывода на основе информации о стилях , отделяющей от содержимого.Например, есть набор специальных последовательностей, которые printf
распознает как специальные символы. В вашем любимом языке может быть больше или меньше последовательностей, но самые распространенные:
\ n
: Новая строка \ r
: возврат каретки \ t
: горизонтальный выступ \ NNN
: конкретный байт с восьмеричным значением, содержащий от одной до трех цифрНапример:
$ printf "\ t \ 123 \ 105 \ 124 \ 110 \ n"
SETH
$
В этом примере Bash printf
отображает символ табуляции, за которым следуют символы ASCII, присвоенные строке из четырех восьмеричных значений.Это завершается управляющей последовательностью для создания новой строки ( \ n
).
Попытка сделать то же самое с echo
дает нечто более буквальное:
$ echo "\ t \ 123 \ 105 \ 124 \ 110 \ n"
\ t \ 123 \ 105 \ 124 \ 110 \ n
$
Использование функции Python print
для той же задачи показывает, что в команде Python print
есть нечто большее, чем вы могли ожидать:
>>> print ("\ t \ 123 \ n")
S>>>
Очевидно, что Python print
включает в себя традиционные функции printf
, а также функции простого echo
или cout
.
Однако эти примеры не содержат ничего, кроме буквальных символов, и хотя они полезны в некоторых ситуациях, они, вероятно, наименее значимая вещь в printf
. Истинная сила printf
заключается в спецификации формата.
Описатели формата - это символы, которым предшествует знак процента (%
).
Общие включают:
% s
: строка% d
: цифра% f
: Число с плавающей запятой% o
: восьмеричное число Это заполнители в инструкции printf
, которые вы можете заменить на значение, указанное в другом месте в инструкции printf
.То, где предоставляются эти значения, зависит от используемого вами языка и его синтаксиса, но вот простой пример на Java:
строка var = "привет \ n";
system.out.printf ("% s", var);
Это, заключенное в соответствующий шаблонный код и выполненное, отображает:
Однако становится еще интереснее, когда изменяется содержимое переменной. Предположим, вы хотите обновить вывод на основе постоянно увеличивающегося числа:
.# включитьint main () {
int var = 0;
в то время как (var <100) {
var ++;
printf ("Обработка завершена% d%. \ N", var);
}
возврат 0;
}
Скомпилировано и запущено:
Обработка завершена на 1%.
[...]
Обработка завершена на 100%.
Обратите внимание, что двойное число %
в коде преобразуется в один напечатанный символ %
.
Числа могут быть сложными, а printf
предлагает множество вариантов форматирования.Вы можете ограничить количество печатаемых десятичных знаков, используя % f
для чисел с плавающей запятой. Помещая точку (.
) вместе с числом ограничителя между знаком процента и f
, вы сообщаете printf
, сколько десятичных знаков нужно отобразить. Вот простой пример, написанный на Bash для краткости:
$ printf "% .2f \ n" 3.141519
3.14
$
Аналогичный синтаксис применим и к другим языкам. Вот пример на C:
#include
#includeint main () {
fprintf (stdout, "% .2f \ n", 4 * atan (1.0));
возврат 0;
}
Для трех десятичных знаков используйте .3f
и так далее.
Поскольку большие числа трудно разобрать, их обычно разделяют запятыми. Вы можете указать printf
добавить запятые по мере необходимости, поместив апостроф ( '
) между знаком процента и d
:
$ printf "% 'd \ n" 1024
1024
$ printf "%' d \ n" 1024601
1024,601
$
Еще одно распространенное использование printf
- это наложение определенного формата на числа в именах файлов.Например, если у вас есть 10 последовательных файлов на компьютере, компьютер может отсортировать 10.jpg
перед 1.jpg
, что, вероятно, не является вашим намерением. При программной записи в файл вы можете использовать printf
для формирования имени файла с начальными нулевыми символами. Вот пример в Bash для краткости:
$ printf "% 03d.jpg \ n" {1..10}
001.jpg
002.jpg
[...]
010.jpg
Обратите внимание, что в каждом номере используется максимум 3 разряда.
Как вы можете видеть из этих примеров printf
, включение управляющих символов, особенно \ n
, может быть утомительным, а синтаксис относительно сложным. По этой причине были разработаны такие ярлыки, как echo
и cout
. Однако, если вы время от времени будете использовать printf
, вы привыкнете к синтаксису, и он станет вашей второй натурой. Я не вижу причин, по которым printf
должен быть вашим первым выбором для печати выписок во время повседневной деятельности, но это отличный инструмент, с которым достаточно удобно, чтобы он не замедлял вас, когда он вам нужен.
Найдите время, чтобы выучить printf
на выбранном вами языке и использовать его, когда вам это нужно. Это мощный инструмент, о котором вы не пожалеете.
echo 123.4567 | awk '{printf "% .3f \ n", $ 1}' 123,457 echo 123.4567 | awk '{printf "% .1f \ n", $ 1}' 123,5 echo 123.4567 | awk '{printf "% 2.1f \ n", $ 1}' 123,5 echo 123.4567 | awk '{printf "% 5.1f \ n", $ 1}' 123,5 echo 123.4567 | awk '{printf "% 8.1f \ n", $ 1}' 123,5 echo 123.4567 | awk '{printf "% 8.6f \ n ", $ 1} ' 123,456700 echo 123.4567 | awk '{printf "% .2e \ n", $ 1}' 1.23e + 02 echo 123.4567 | awk '{printf "% .4e \ n", $ 1}' 1.2346e + 02 echo 123.4567 55.2 | awk '{printf "% .3f", $ 1; распечатать $ 2} ' 123,45755,2 echo 123.4567 55.2 | awk '{printf "% .3f", $ 1; распечатать $ 2} ' 123,457 55,2 echo 123.4567 55.2 | awk '{printf "% -20.7f% d \ n", $ 1, $ 2}' 123.4567000 55 echo 123.4567 55.2 | awk '{printf "% 20.7f% d \ n", $ 1, $ 2} 123.4567000 55 Вот список букв управления форматом: `c 'Это печатает число как символ ASCII.Таким образом, `printf"% c ", 65 'выводит букву` A'. Вывод для строкового значения - это первый символ строки. `d 'Выводит десятичное целое число. `i 'Это также выводит десятичное целое число. `e 'Печатает число в научном (экспоненциальном) представлении. Например, printf «% 4.3e», 1950 выводит «1.950e + 03», всего четыре значащих цифры, три из которых следуют за десятичной точкой. «4.3» - это модификаторы, обсуждаемые ниже. `f 'Печатает число в нотации с плавающей запятой.`g 'Это печатает число либо в экспоненциальной нотации, либо в нотации с плавающей запятой, в зависимости от того, что использует меньше символов. `o 'Выводит восьмеричное целое число без знака. `s 'Это печатает строку. `x 'Выводит шестнадцатеричное целое число без знака. `X 'Печатает шестнадцатеричное целое число без знака. Однако для значений от 10 до 15 он использует буквы от «A» до «F» вместо «a» до «f». `% 'На самом деле это не буква управления форматом, но она имеет значение при использовании после`%': последовательность `%% 'выводит один`%'.Он не требует аргументов. ######################################### Модификаторы для форматов printf Спецификация формата также может включать модификаторы, которые могут контролировать, какая часть значения элемента будет напечатана и сколько места она получит. Модификаторы располагаются между `% 'и буквой управления форматом. Вот возможные модификаторы в том порядке, в котором они могут появляться: `- ' Знак минус, используемый перед модификатором ширины, указывает на выравнивание аргумента по левому краю в пределах указанной ширины.Обычно аргумент печатается с выравниванием по правому краю указанной ширины. Таким образом, printf "% -4s", "foo" печатает `foo '. `ширина ' Это число, представляющее желаемую ширину поля. Если вставить любое число между знаком `% 'и символом управления форматом, поле будет расширено до этой ширины. По умолчанию это можно сделать с помощью пробелов слева. Например, printf "% 4s", "foo" печатает `foo '. Значение ширины - это минимальная ширина, а не максимальная. Если для значения элемента требуется больше символов ширины, оно может быть сколь угодно широким.Таким образом, printf "% 4s", "foobar" печатает `foobar '. Знак минус перед шириной приводит к заполнению вывода пробелами справа, а не слева. .prec Это число, указывающее точность, используемую при печати. Это определяет количество цифр, которое вы хотите напечатать справа от десятичной точки. Для строки он определяет максимальное количество символов из строки, которое должно быть напечатано. Примеры использования printf Вот как использовать printf для создания выровненной таблицы: awk '{printf "% -10s% s \ n", $ 1, $ 2}' BBS-список печатает имена досок объявлений ($ 1) файла `BBS-list 'в виде строки из 10 символов с выравниванием по левому краю.Затем он также печатает телефонные номера (2 доллара США) в строке. Это создает выровненную таблицу из двух столбцов с именами и телефонными номерами: трубкозуб 555-5553 альпо-нетто 555-3412 barfly 555-7685 укусы 555-1675 камелот 555-0542 ядро 555-2912 fooey 555-1234 стопа 555-6699 macfoo 555-6480 sdace 555-3430 sabafoo 555-2127 Вы обратили внимание, что мы не указали, что номера телефонов должны быть напечатаны как числа? Их нужно было печатать строками, потому что числа разделены тире.Это тире было бы интерпретировано как знак минус, если бы мы попытались напечатать телефонные номера как числа. Это привело бы к довольно запутанным результатам. Мы не указали ширину для телефонных номеров, потому что они последние в своих строках. Нам не нужно ставить после них пробелы. Мы могли бы сделать нашу таблицу еще красивее, добавив заголовки в верхнюю часть столбцов. Для этого используйте шаблон BEGIN (см. Раздел Специальные шаблоны BEGIN и END). для принудительной печати заголовка только один раз, в начале awk-программы: awk 'BEGIN {print "Имя Число" Распечатать "---- ------" } {printf "% -10s% s \ n", $ 1, $ 2} 'BBS-список Вы заметили, что в приведенном выше примере мы смешали операторы print и printf? Мы могли бы использовать только операторы printf для получения тех же результатов: awk 'BEGIN {printf "% -10s% s \ n", "Имя", "Число" printf "% -10s% s \ n", "----", "------"} {printf "% -10s% s \ n", $ 1, $ 2} 'BBS-список Путем вывода заголовка каждого столбца с той же спецификацией формата, которая используется для элементов столбца, мы убедились, что заголовки выровнены так же, как и столбцы.Тот факт, что одна и та же спецификация формата используется три раза, можно подчеркнуть, сохранив ее в переменной, например: awk 'BEGIN {format = "% -10s% s \ n" формат printf, «Имя», «Число» формат printf, "----", "------"} {printf format, $ 1, $ 2} 'BBS-список Используйте оператор printf, чтобы выровнять заголовки и данные таблицы f awk 'BEGIN {print "Имя Число" Распечатать "---- ------" } {printf "% -10s% s \ n", $ 1, $ 2} 'BBS-список Мы смешали операторы print и printf в приведенном выше примере? Мы могли бы использовать только операторы printf для получения тех же результатов: awk 'BEGIN {printf "% -10s% s \ n", "Имя", "Число" printf "% -10s% s \ n", "----", "------"} {printf "% -10s% s \ n", $ 1, $ 2} 'BBS-список Путем вывода заголовка каждого столбца с той же спецификацией формата, которая используется для элементов столбца, мы убедились, что заголовки выровнены так же, как и столбцы.Тот факт, что одна и та же спецификация формата используется три раза, можно подчеркнуть, сохранив ее в переменной, например: awk 'BEGIN {format = "% -10s% s \ n" формат printf, «Имя», «Число» формат printf, "----", "------"} {printf format, $ 1, $ 2} 'BBS-список
Сформируйте свою стратегию и преобразуйте гибридную ИТ-среду.
Помогите вам внедрить безопасность в цепочку создания стоимости ИТ и наладить сотрудничество между ИТ-подразделениями, приложениями и службами безопасности.
Помогите вам быстрее реагировать и получить конкурентное преимущество благодаря гибкости предприятия.
Ускорьте получение результатов гибридного облака с помощью услуг по консультированию, трансформации и внедрению.
Службы управления приложениями, которые позволяют поручить управление решениями экспертам, разбирающимся в вашей среде.
Услуги стратегического консалтинга для разработки вашей программы цифровой трансформации.
Полнофункциональное моделирование сценариев использования с предустановленной интеграцией всего портфеля программного обеспечения Micro Focus, демонстрирующее реальные сценарии использования
Услуги экспертной аналитики безопасности, которые помогут вам быстро спроектировать, развернуть и проверить реализацию технологии безопасности Micro Focus.
Служба интеграции и управления услугами, которая оптимизирует доставку, гарантии и управление в условиях нескольких поставщиков.
Анализируйте большие данные с помощью аналитики в реальном времени и ищите неструктурированные данные.
Анализируйте большие данные с помощью аналитики в реальном времени и ищите неструктурированные данные.
Анализируйте большие данные с помощью аналитики в реальном времени и ищите неструктурированные данные.
Мобильные услуги, которые обеспечивают производительность и ускоряют вывод продукта на рынок без ущерба для качества.
Анализируйте большие данные с помощью аналитики в реальном времени и ищите неструктурированные данные.
Комплексные услуги по работе с большими данными для продвижения вашего предприятия.
printf ФОРМАТ [АРГУМЕНТ ...]
printf использует строку формата FORMAT для печати аргументов ARGUMENT.Это означает, что он принимает спецификаторы формата в строке формата и заменяет каждый аргументом.
Аргумент формата используется повторно столько раз, сколько необходимо для преобразования всех заданных аргументов. Итак, printf% s \ n flounder catfish clownfish shark
напечатает четыре строки.
В отличие от echo, printf
не добавляет новую строку, если она не указана как часть строки.
Он не поддерживает никаких параметров, поэтому нет необходимости в разделителе -
, что упрощает использование для произвольного ввода, чем echo
.
Допустимые спецификаторы формата берутся из функции библиотеки C printf (3)
:
% d
или % i
: аргумент будет использоваться как десятичное целое число (со знаком или без знака)
% o
: восьмеричное целое число без знака
% u
: Десятичное целое число без знака - это означает, что отрицательные числа будут переноситься вокруг
% x
или % X
: шестнадцатеричное целое число без знака
% f
, % g
или % G
: число с плавающей запятой.% f
по умолчанию - 6 знаков после десятичной точки (это зависит от локали - например, в de_DE это будет ,
). % g
и % G
обрежет конечные нули и переключится на экспоненциальное представление (например, % e
), если числа станут достаточно маленькими или большими.
% e
или % E
: число с плавающей запятой в научном (XXXeYY) представлении
% s
: строка
% b
: Как строка, интерпретирующая обратная косая черта с escape-символами, за исключением восьмеричных escape-символов в форме 0 или 0ooo.
%%
означает буквальный "%".
Преобразование может завершиться ошибкой, например «102.234» не может преобразовать без потерь в целое число, в результате чего printf выдает ошибку. Если вы не против потери информации, отключите ошибки с помощью 2> / dev / null
.
Число между %
и буквой формата определяет ширину. Результат будет дополнен пробелами слева.
printf также знает несколько экранирований с обратной косой чертой:
\ "
двойная кавычка
\
обратная косая черта
\
оповещение (звонок)
\ b
возврат
\ c
больше не выводится
\ e
побег
\ f
подача формы
\ n
новая строка
\ r
возврат каретки
\ t
горизонтальный язычок
\ v
вертикальный язычок
\ ooo
восьмеричное число (ooo - от 1 до 3 цифр)
\ xhh
шестнадцатеричное число (hhh - от 1 до 2 цифр)
\ uhhhh
16-битный символ Unicode (hhhh - 4 цифры)
\ Uhhhhhhhh
32-битный символ Unicode (hhhhhhhh - 8 цифр)
Если данный аргумент не работает для данного формата (например, когда вы пытаетесь преобразовать число вроде 3.141592 в целое число), printf выводит ошибку в stderr. printf тогда также вернет ненулевое значение, но все равно будет пытаться напечатать столько, сколько сможет.
Он также вернет ненулевое значение, если вообще не был задан аргумент, и в этом случае он ничего не напечатает.
Этот printf был импортирован из printf в GNU Coreutils версии 6.9. Если вы хотите использовать более новую версию printf, например, поставляемую с вашей ОС, попробуйте команду printf
.
printf '% s \ t% s \ n' камбала
Напечатает «камбалу» (разделенную символом табуляции), за которой следует символ новой строки.Это полезно для написания дополнений, так как fish ожидает, что скрипты завершения выведут параметр, за которым следует описание, разделенное символом табуляции.
printf '% s:% d' "Количество бананов в кармане" 42
Напечатает «Количество бананов в кармане: 42», без новой строки.
.