Printf

Revision as of 14:06, 24 May 2025 by imported>Remsense (Reverted 1 edit by Wukuendo (talk): Like I already told you in edit summary, I see no reason for mention of this little-known language in every possible location where it possibly relevant. It's not WP:DUE, or at least you've made no attempt to demonstrate that it is (i.e. that its mention is of any real relevance to readers, and doesn't amount to advertising.))
(diff) ← Previous revision | Latest revision (diff) | Newer revision → (diff)

Template:Short description Template:More citations needed Template:Use dmy dates Template:Use American English Template:Lowercase title

File:Printf.svg
An example call to the printf function

printf is a C standard library function that formats text and writes it to standard output. The function accepts a format c-string argument and a variable number of value arguments that the function serializes per the format string. Mismatch between the format specifiers and count and type of values results in undefined behavior and possibly program crash or other vulnerability.

The format string is encoded as a template language consisting of verbatim text and format specifiers that each specify how to serialize a value. As the format string is processed left-to-right, a subsequent value is used for each format specifier found. A format specifier starts with a <syntaxhighlight lang="text" class="" style="" inline="1">%</syntaxhighlight> character and has one or more following characters that specify how to serialize a value.

The standard library provides other, similar functions that form a family of printf-like functions. The functions share the same formatting capabilities but provide different behavior such as output to a different destination or safety measures that limit exposure to vulnerabilities. Functions of the printf-family have been implemented in other programming contexts (i.e. languages) with the same or similar syntax and semantics.

The scanf C standard library function complements printf by providing formatted input (a.k.a. lexing, a.k.a. parsing) via a similar format string syntax.

The name, printf, is short for print formatted where print refers to output to a printer although the function is not limited to printer output. Today, print refers to output to any text-based environment such as a terminal or a file.

HistoryEdit

1950s: FortranEdit

Early programming languages like Fortran used special statements with different syntax from other calculations to build formatting descriptions.<ref name="Sayre_1956">Template:Cite book (2+51+1 pages)</ref> In this example, the format is specified on line Template:Samp, and the <syntaxhighlight lang="fortran" class="" style="" inline="1">PRINT</syntaxhighlight>Template:Efn command refers to it by line number: <syntaxhighlight lang="fortranfixed">

     PRINT 601, IA, IB, AREA
601  FORMAT (4H A= ,I5,5H  B= ,I5,8H  AREA= ,F10.2, 13H SQUARE UNITS)

</syntaxhighlight>

Hereby:

  • <syntaxhighlight lang="fortran" class="" style="" inline="1">4H</syntaxhighlight> indicates a string of 4 characters " A= " (<syntaxhighlight lang="text" class="" style="" inline="1">H</syntaxhighlight> means Hollerith Field);
  • <syntaxhighlight lang="fortran" class="" style="" inline="1">I5</syntaxhighlight> indicates an integer field of width 5;
  • <syntaxhighlight lang="fortran" class="" style="" inline="1">F10.2</syntaxhighlight> indicates a floating-point field of width 10 with 2 digits after the decimal point.

An output with input arguments <syntaxhighlight lang="text" class="" style="" inline="1">100</syntaxhighlight>, <syntaxhighlight lang="text" class="" style="" inline="1">200</syntaxhighlight>, and <syntaxhighlight lang="text" class="" style="" inline="1">1500.25</syntaxhighlight> might look like this:

<syntaxhighlight lang="output">

A=   100  B=   200  AREA=    1500.25 SQUARE UNITS

</syntaxhighlight>

1960s: BCPL and ALGOL 68Edit

In 1967, BCPL appeared.<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> Its library included the <syntaxhighlight lang="text" class="" style="" inline="1">writef</syntaxhighlight> routine.<ref>Template:Cite book</ref> An example application looks like this: <syntaxhighlight lang="text"> WRITEF("%I2-QUEENS PROBLEM HAS %I5 SOLUTIONS*N", NUMQUEENS, COUNT) </syntaxhighlight>

Hereby:

  • <syntaxhighlight lang="text" class="" style="" inline="1">%I2</syntaxhighlight> indicates an integer of width 2 (the order of the format specification's field width and type is reversed compared to C's <syntaxhighlight lang="text" class="" style="" inline="1">printf</syntaxhighlight>);
  • <syntaxhighlight lang="text" class="" style="" inline="1">%I5</syntaxhighlight> indicates an integer of width 5;
  • <syntaxhighlight lang="text" class="" style="" inline="1">*N</syntaxhighlight> is a BCPL language escape sequence representing a newline character (for which C uses the escape sequence <syntaxhighlight lang="text" class="" style="" inline="1">\n</syntaxhighlight>).

In 1968, ALGOL 68 had a more function-like API, but still used special syntax (the <syntaxhighlight lang="text" class="" style="" inline="1">$</syntaxhighlight> delimiters surround special formatting syntax): <syntaxhighlight lang="cpp"> printf(($"Color "g", number1 "6d,", number2 "4zd,", hex "16r2d,", float "-d.2d,", unsigned value"-3d"."l$,

        "red", 123456, 89, BIN 255, 3.14, 250));

</syntaxhighlight>

In contrast to Fortran, using normal function calls and data types simplifies the language and compiler, and allows the implementation of the input/output to be written in the same language.

These advantages were thought to outweigh the disadvantages (such as a complete lack of type safety in many instances) up until the 2000s, and in most newer languages of that era I/O is not part of the syntax.

People have since learned<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> that this potentially results in consequences, ranging from security exploits to hardware failures (e.g., phone's networking capabilities being permanently disabled after trying to connect to an access point named "%p%s%s%s%s%n"<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref>). Modern languages, such as C++20 and later, tend to include format specifications as a part of the language syntax,<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> which restore type safety in formatting to an extent, and allow the compiler to detect some invalid combinations of format specifiers and data types at compile time.

1970s: CEdit

In 1973, <syntaxhighlight lang="text" class="" style="" inline="1">printf</syntaxhighlight> was included as a C standard library routine as part of Version 4 Unix.<ref name="reader">Template:Cite tech report</ref>

1990s: Shell commandEdit

In 1990, the printf shell command, modeled after the C standard library function, was included with 4.3BSD-Reno.<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> In 1991, a <syntaxhighlight lang="text" class="" style="" inline="1">printf</syntaxhighlight> command was included with GNU shellutils (now part of GNU Core Utilities).

2000s: -Wformat safetyEdit

The need to do something about the range of problems resulting from lack of type safety has prompted attempts to make the C++ compiler <syntaxhighlight lang="text" class="" style="" inline="1">printf</syntaxhighlight>-aware.

The Template:Kbd option of GCC allows compile-time checks to <syntaxhighlight lang="text" class="" style="" inline="1">printf</syntaxhighlight> calls, enabling the compiler to detect a subset of invalid calls (and issue either a warning or an error, stopping the compilation altogether, depending on other flags).<ref>Template:Cite manual</ref>

Since the compiler is inspecting <syntaxhighlight lang="text" class="" style="" inline="1">printf</syntaxhighlight> format specifiers, enabling this effectively extends the C++ syntax by making formatting a part of it.

2020s: std::printEdit

To address usability issues with the existing C++ input/output support, as well as avoid safety issues of printf<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> the C++ standard library was revised<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> to support a new type-safe formatting starting with C++20.<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> The approach of <syntaxhighlight lang="cpp" class="" style="" inline="1">std::format</syntaxhighlight> resulted from incorporating Victor Zverovich's <syntaxhighlight lang="text" class="" style="" inline="1">libfmt</syntaxhighlight><ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> API into the language specification<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> (Zverovich wrote<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> the first draft of the new format proposal); consequently, <syntaxhighlight lang="text" class="" style="" inline="1">libfmt</syntaxhighlight> is an implementation of the C++20 format specification. In C++23, another function, <syntaxhighlight lang="cpp" class="" style="" inline="1">std::print</syntaxhighlight>, was introduced that combines formatting and outputting and therefore is a functional replacement for <syntaxhighlight lang="text" class="" style="" inline="1">printf()</syntaxhighlight>.<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref>

As the format specification has become a part of the language syntax, a C++ compiler is able to prevent invalid combinations of types and format specifiers in many cases. Unlike the Template:Kbd option, this is not an optional feature.

The format specification of <syntaxhighlight lang="text" class="" style="" inline="1">libfmt</syntaxhighlight> and <syntaxhighlight lang="cpp" class="" style="" inline="1">std::format</syntaxhighlight> is, in itself, an extensible "mini-language" (referred to as such in the specification),<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> an example of a domain-specific language. As such, <syntaxhighlight lang="cpp" class="" style="" inline="1">std::print</syntaxhighlight>, completes a historical cycle; bringing the state-of-the-art (as of 2024) back to what it was in the case of Fortran's first <syntaxhighlight lang="fortran" class="" style="" inline="1">PRINT</syntaxhighlight> implementation in the 1950s.

Format specifierEdit

Formatting of a value is specified as markup in the format string. For example, the following outputs Your age is and then the value of the variable Template:Var in decimal format.

<syntaxhighlight lang="c"> printf("Your age is %d", age); </syntaxhighlight>

SyntaxEdit

The syntax for a format specifier is:

%[parameter][flags][width][.precision][length]type

Parameter fieldEdit

The parameter field is optional. If included, then matching specifiers to values is Template:Em sequential. The numeric value Template:Samp selects the n-th value parameter. This is a POSIX extension; not C99.Template:Needs citation

Template:Table alignment

Text Description
Template:Tt n is the index of the value parameter to serialize using this format specifier

This field allows for using the same value multiple times in a format string instead of having to pass the value multiple times. If a specifier includes this field, then subsequent specifiers must also.

For example, <syntaxhighlight lang="c"> printf("%2$d %2$#x; %1$d %1$#x",16,17); </syntaxhighlight> outputs: Template:Samp

This field is particularly useful for localizing messages to different natural languages that use different word orders.

In Windows API, support for this feature is via a different function, <syntaxhighlight lang="text" class="" style="" inline="1">printf_p</syntaxhighlight>.

Flags fieldEdit

The flags field can be zero or more of (in any order):

Template:Table alignment

Text Description
Template:Tt Left-align the output of this placeholder; default is to right-align the output
Template:Tt Prepends a plus sign for a positive value; by default a positive value does not have a prefix

(space)
Prepends a space character for a positive value; ignored if the Template:Tt flag exists; by default a positive value does not have a prefix
Template:Tt When the 'width' option is specified, prepends zeros for numeric types; by prepends spaces; for example, <syntaxhighlight lang="c" class="" style="" inline="1">printf("%4X",3)</syntaxhighlight> produces " 3", while <syntaxhighlight lang="c" class="" style="" inline="1">printf("%04X",3);</syntaxhighlight> produces Template:Samp
Template:Tt The integer or exponent of a decimal has the thousands grouping separator applied
Template:Tt Alternate form:
For Template:Tt and Template:Tt types, trailing zeros are not removed
For Template:Tt, Template:Tt, Template:Tt, Template:Tt, Template:Tt, Template:Tt types, the output always contains a decimal point
For Template:Tt, Template:Tt, Template:Tt types, the text Template:Tt, Template:Tt, Template:Tt, respectively, is prepended to non-zero numbers

Width fieldEdit

The width field specifies the Template:Em number of characters to output. If the value can be represented in fewer characters, then the value is left-padded with spaces so that output is the number of characters specified. If the value requires more characters, then the output is longer than the specified width. A value is never truncated.

For example, <syntaxhighlight lang="c" class="" style="" inline="1">printf("%3d", 12);</syntaxhighlight> specifies a width of 3 and outputs Template:Samp with a space on the left to output 3 characters. The call <syntaxhighlight lang="c" class="" style="" inline="1">printf("%3d", 1234);</syntaxhighlight> outputs Template:Samp which is 4 characters long since that is the minimum width for that value even though the width specified is 3.

If the width field is omitted, the output is the minimum number of characters for the value.

If the field is specified as <syntaxhighlight lang="text" class="" style="" inline="1">*</syntaxhighlight>, then the width value is read from the list of values in the call.<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> For example, <syntaxhighlight lang="c" class="" style="" inline="1">printf("%*d", 3, 10);</syntaxhighlight> outputs 10 where the second parameter, <syntaxhighlight lang="c" class="" style="" inline="1">3</syntaxhighlight>, is the width (matches with <syntaxhighlight lang="text" class="" style="" inline="1">*</syntaxhighlight>) and <syntaxhighlight lang="c" class="" style="" inline="1">10</syntaxhighlight> is the value to serialize (matches with <syntaxhighlight lang="text" class="" style="" inline="1">d</syntaxhighlight>).

Though not part of the width field, a leading zero is interpreted as the zero-padding flag mentioned above, and a negative value is treated as the positive value in conjunction with the left-alignment <syntaxhighlight lang="text" class="" style="" inline="1">-</syntaxhighlight> flag also mentioned above.

The width field can be used to format values as a table (tabulated output). But, columns do not align if any value is larger than fits in the width specified. For example, notice that the last line value (Template:Samp) does not fit in the first column of width 3 and therefore the column is not aligned.

<syntaxhighlight lang="output">

 1   1
12  12

123 123 1234 123 </syntaxhighlight>

Precision fieldEdit

The precision field usually specifies a Template:Em limit of the output, depending on the particular formatting type. For floating-point numeric types, it specifies the number of digits to the right of the decimal point to which the output should be rounded; for <syntaxhighlight lang="text" class="" style="" inline="1">%g</syntaxhighlight> and <syntaxhighlight lang="text" class="" style="" inline="1">%G</syntaxhighlight> it specifies the total number of significant digits (before and after the decimal, not including leading or trailing zeroes) to round to. For the string type, it limits the number of characters that should be output, after which the string is truncated.

The precision field may be omitted, or a numeric integer value, or a dynamic value when passed as another argument when indicated by an asterisk (<syntaxhighlight lang="text" class="" style="" inline="1">*</syntaxhighlight>). For example, <syntaxhighlight lang="c" class="" style="" inline="1">printf("%.*s", 3, "abcdef");</syntaxhighlight> outputs Template:Samp.

Length fieldEdit

The length field can be omitted or be any of:

Template:Table alignment

Text Description
Template:Tt For integer types, causes Template:Tt to expect an Template:Tt-sized integer argument which was promoted from a Template:Tt.
Template:Tt For integer types, causes Template:Tt to expect an Template:Tt-sized integer argument which was promoted from a Template:Tt.
Template:Tt For integer types, causes Template:Tt to expect a Template:Tt-sized integer argument.

For floating-point types, this is ignored. Template:Tt arguments are always promoted to Template:Tt when used in a varargs call.<ref name="c99io">Template:Cite standard</ref>

Template:Tt For integer types, causes Template:Tt to expect a Template:Tt-sized integer argument.
Template:Tt For floating-point types, causes Template:Tt to expect a Template:Tt argument.
Template:Tt For integer types, causes Template:Tt to expect a Template:Tt-sized integer argument.
Template:Tt For integer types, causes Template:Tt to expect a Template:Tt-sized integer argument.
Template:Tt For integer types, causes Template:Tt to expect a Template:Tt-sized integer argument.

Platform-specific length options came to exist prior to widespread use of the ISO C99 extensions, including:

Template:Table alignment

Text Description Commonly found platforms
Template:Tt For signed integer types, causes Template:Tt to expect Template:Tt-sized integer argument; for unsigned integer types, causes Template:Tt to expect Template:Tt-sized integer argument. Win32/Win64
Template:Tt For integer types, causes Template:Tt to expect a 32-bit (double word) integer argument. Win32/Win64
Template:Tt For integer types, causes Template:Tt to expect a 64-bit (quad word) integer argument. Win32/Win64
Template:Tt For integer types, causes Template:Tt to expect a 64-bit (quad word) integer argument. BSD

ISO C99 includes the inttypes.h header file that includes a number of macros for platform-independent <syntaxhighlight lang="text" class="" style="" inline="1">printf</syntaxhighlight> coding. For example: <syntaxhighlight lang="c" class="" style="" inline="1">printf("%" PRId64, t);</syntaxhighlight> specifies decimal format for a 64-bit signed integer. Since the macros evaluate to a string literal, and the compiler concatenates adjacent string literals, the expression <syntaxhighlight lang="c" class="" style="" inline="1">"%" PRId64</syntaxhighlight> compiles to a single string.

Macros include:

Macro Description
Template:Tt Typically equivalent to Template:Tt (Win32/Win64) or Template:Tt
Template:Tt Typically equivalent to Template:Tt (Win32/Win64), Template:Tt (32-bit platforms) or Template:Tt (64-bit platforms)
Template:Tt Typically equivalent to Template:Tt (Win32/Win64) or Template:Tt
Template:Tt Typically equivalent to Template:Tt (Win32/Win64), Template:Tt (32-bit platforms) or Template:Tt (64-bit platforms)
Template:Tt Typically equivalent to Template:Tt (Win32/Win64) or Template:Tt
Template:Tt Typically equivalent to Template:Tt (Win32/Win64), Template:Tt (32-bit platforms) or Template:Tt (64-bit platforms)
Template:Tt Typically equivalent to Template:Tt (Win32/Win64) or Template:Tt
Template:Tt Typically equivalent to Template:Tt (Win32/Win64), Template:Tt (32-bit platforms) or Template:Tt (64-bit platforms)

Type fieldEdit

The type field can be any of:

Template:Table alignment

Text Description
Template:Tt Output a literal Template:Tt character; does not accept flags, width, precision or length fields
Template:Tt, Template:Tt (signed) Template:Tt formatted as decimal; Template:Tt and Template:Tt are synonymous except when used with scanf
Template:Tt Template:Tt formatted as decimal.
Template:Tt, Template:Tt Template:Tt formatted as fixed-point; Template:Tt and Template:Tt only differs in how the strings for an infinite number or NaN are printed (Template:Tt, Template:Tt and Template:Tt for Template:Tt; Template:Tt, Template:Tt and Template:Tt for Template:Tt)
Template:Tt, Template:Tt Template:Tt formatted as in exponential notation Template:Tt; Template:Tt results in Template:Tt rather than Template:Tt to introduce the exponent; the exponent always contains at least two digits; if the value is zero, the exponent is Template:Tt; in Windows, the exponent contains three digits by default, e.g. Template:Tt, but this can be altered by Microsoft-specific <syntaxhighlight lang="text" class="" style="" inline="1">_set_output_format</syntaxhighlight> function
Template:Tt, Template:Tt Template:Tt formatted as either fixed-point or exponential notation, whichever is more appropriate for its magnitude; Template:Tt uses lower-case letters, Template:Tt uses upper-case letters; this type differs slightly from fixed-point notation in that insignificant zeroes to the right of the decimal point are not included, and that the precision field specifies the total number of significant digits rather than the digits after the decimal; the decimal point is not included on whole numbers
Template:Tt, Template:Tt Template:Tt formatted as hexadecimal; Template:Tt uses lower-case letters and Template:Tt uses upper-case
Template:Tt Template:Tt formatted as octal
Template:Tt null-terminated string
Template:Tt Template:Tt
Template:Tt Pointer formatted in an implementation-defined way
Template:Tt, Template:Tt Template:Tt in hexadecimal notation, starting with Template:Tt or Template:Tt. Template:Tt uses lower-case letters, Template:Tt uses upper-case letters<ref>{{#invoke:citation/CS1|citation CitationClass=web

}}</ref><ref> "printf" (Template:Tt added in C99) </ref>

Template:Tt Outputs nothing but writes the number of characters written so far into an integer pointer parameter; in Java this prints a newline<ref>{{#invoke:citation/CS1|citation CitationClass=web

}}</ref>

Custom data type formattingEdit

A common way to handle formatting with a custom data type is to format the custom data type value into a string, then use the <syntaxhighlight lang="c" class="" style="" inline="1">%s</syntaxhighlight> specifier to include the serialized value in a larger message.

Some printf-like functions allow extensions to the escape-character-based mini-language, thus allowing the programmer to use a specific formatting function for non-builtin types. One is the (now deprecated) glibc's <syntaxhighlight lang="text" class="" style="" inline="1">register_printf_function()</syntaxhighlight>. However, it is rarely used due to the fact that it conflicts with static format string checking. Another is Vstr custom formatters, which allows adding multi-character format names.

Some applications (like the Apache HTTP Server) include their own printf-like function, and embed extensions into it. However these all tend to have the same problems that <syntaxhighlight lang="text" class="" style="" inline="1">register_printf_function()</syntaxhighlight> has.

The Linux kernel printk function supports a number of ways to display kernel structures using the generic <syntaxhighlight lang="c" class="" style="" inline="1">%p</syntaxhighlight> specification, by Template:Em additional format characters.<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref> For example, <syntaxhighlight lang="c" class="" style="" inline="1">%pI4</syntaxhighlight> prints an IPv4 address in dotted-decimal form. This allows static format string checking (of the <syntaxhighlight lang="c" class="" style="" inline="1">%p</syntaxhighlight> portion) at the expense of full compatibility with normal printf.

VulnerabilitiesEdit

Format string attackEdit

Extra value arguments are ignored, but if the format string has more format specifiers than value arguments passed, the behavior is undefined. For some C compilers, an extra format specifier results in consuming a value even though there isn't one which allows the format string attack. Generally, for C, arguments are passed on the stack. If too few arguments are passed, then printf can read past the end of the stack frame, thus allowing an attacker to read the stack.

Some compilers, like the GNU Compiler Collection, will statically check the format strings of printf-like functions and warn about problems (when using the flags Template:Kbd or Template:Kbd). GCC will also warn about user-defined printf-style functions if the non-standard "format" <syntaxhighlight lang="text" class="" style="" inline="1">__attribute__</syntaxhighlight> is applied to the function.

Uncontrolled format string exploitEdit

The format string is often a string literal, which allows static analysis of the function call. However, the format string can be the value of a variable, which allows for dynamic formatting but also a security vulnerability known as an uncontrolled format string exploit.

Memory writeEdit

Although an output function on the surface, <syntaxhighlight lang="text" class="" style="" inline="1">printf</syntaxhighlight> allows writing to a memory location specified by an argument via <syntaxhighlight lang="c" class="" style="" inline="1">%n</syntaxhighlight>. This functionality is occasionally used as a part of more elaborate format-string attacks.<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref>

The <syntaxhighlight lang="c" class="" style="" inline="1">%n</syntaxhighlight> functionality also makes <syntaxhighlight lang="text" class="" style="" inline="1">printf</syntaxhighlight> accidentally Turing-complete even with a well-formed set of arguments. A game of tic-tac-toe written in the format string is a winner of the 27th IOCCC.<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref>

Related functionsEdit

FamilyEdit

Variants of <syntaxhighlight lang="text" class="" style="" inline="1">printf</syntaxhighlight> in the C standard library include:

<syntaxhighlight lang="text" class="" style="" inline="1">fprintf</syntaxhighlight> outputs to a file instead of standard output.

<syntaxhighlight lang="text" class="" style="" inline="1">sprintf</syntaxhighlight> writes to a string buffer instead of standard output.

<syntaxhighlight lang="text" class="" style="" inline="1">snprintf</syntaxhighlight> provides a level of safety over <syntaxhighlight lang="text" class="" style="" inline="1">sprintf</syntaxhighlight> since the caller provides a length n that is the length of the output buffer in bytes (including space for the trailing nul).

<syntaxhighlight lang="text" class="" style="" inline="1">asprintf</syntaxhighlight> provides for safety by accepting a string handle (char**) argument. The function allocates a buffer of sufficient size to contain the formatted text and outputs the buffer via the handle.

For each function of the family, including printf, there is also a variant that accepts a single <syntaxhighlight lang="text" class="" style="" inline="1">va_list</syntaxhighlight> argument rather than a variable list of arguments. Typically, these variants start with "v". For example: <syntaxhighlight lang="text" class="" style="" inline="1">vprintf</syntaxhighlight>, <syntaxhighlight lang="text" class="" style="" inline="1">vfprintf</syntaxhighlight>, <syntaxhighlight lang="text" class="" style="" inline="1">vsprintf</syntaxhighlight>.

Generally, printf-like functions return the number of bytes output or -1 to indicate failure.<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref>

Other contextsEdit

The following list includes notable programming languages that provide (directly or via a standard library) functionality that is the same or similar to the C printf-like functions. Excluded are languages that use format strings that deviate from the style in this article (such as AMPL and Elixir), languages that inherit their implementation from the JVM or other environment (such as Clojure and Scala), and languages that do not have a standard native printf implementation but have external libraries which emulate printf behavior (such as JavaScript).

Template:Div col

|CitationClass=web }}</ref>)

  • Lua (<syntaxhighlight lang="lua" class="" style="" inline="1">string.format</syntaxhighlight>)
  • Maple
  • MATLAB
  • Max (via the <syntaxhighlight lang="text" class="" style="" inline="1">sprintf</syntaxhighlight> object)
  • Objective-C
  • OCaml (via the Printf module)
  • PARI/GP
  • Perl
  • PHP
  • Python (via <syntaxhighlight lang="python" class="" style="" inline="1">%</syntaxhighlight> operator)<ref>Template:Citation</ref>
  • R
  • Raku (via <syntaxhighlight lang="raku" class="" style="" inline="1">printf</syntaxhighlight>, <syntaxhighlight lang="raku" class="" style="" inline="1">sprintf</syntaxhighlight>, and <syntaxhighlight lang="raku" class="" style="" inline="1">fmt</syntaxhighlight>)
  • Red/System
  • Ruby
  • Tcl (via <syntaxhighlight lang="text" class="" style="" inline="1">format</syntaxhighlight> command)
  • Transact-SQL (via <syntaxhighlight lang="text" class="" style="" inline="1">xp_sprintf</syntaxhighlight>)
  • Vala (via <syntaxhighlight lang="text" class="" style="" inline="1">print()</syntaxhighlight> and <syntaxhighlight lang="text" class="" style="" inline="1">FileStream.printf()</syntaxhighlight>)

Template:Div col end

See alsoEdit

NotesEdit

Template:Notelist

ReferencesEdit

Template:Reflist

External linksEdit

Template:CProLang Template:Unix commands