Функция форматированного ввода/вывода printf

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

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

На фото изображено окно программы Sublime text.

Функция Print F

Она выступает ключевым представителем семейства, которая по совместительству считается наиболее яркой. Есть и другие функции, которые применяются в стандартной библиотеке языка 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 вызвана, но все-таки оказывается меньше аргументов, нежели изначально требовалось с целью обработки строки форматирования, то происходит следующее. Производится считывание недостающих аргументов, невзирая на то, что на стыке расположены произвольные информационные данные.

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

Ссылка на основную публикацию