Difference between revisions of "printf"

From SEGGER Wiki
Jump to: navigation, search
m
m
Line 36: Line 36:
 
|-
 
|-
 
| <code>d</code>, <code>i</code>
 
| <code>d</code>, <code>i</code>
|<code>int</code> as a signed [[decimal]] number. <code>%d</code> and <code>%i</code> are synonymous.
+
|<code>int</code> as a signed [[decimal]] number. <code>%d</code> and <code>%i</code> are synonymous for output, but are different when used with <code>[[scanf]]()</code> for input (where using <code>%i</code> will interpret a number as hexadecimal if it's preceded by <code>0x</code>, and octal if it's preceded by <code>0</code>.)
 
|-
 
|-
 
| <code>u</code>
 
| <code>u</code>
Line 52: Line 52:
 
| <code>x</code>, <code>X</code>
 
| <code>x</code>, <code>X</code>
 
|<code>unsigned int</code> as a [[hexadecimal]] number. <code>x</code> uses lower-case letters and <code>X</code> uses upper-case.
 
|<code>unsigned int</code> as a [[hexadecimal]] number. <code>x</code> uses lower-case letters and <code>X</code> uses upper-case.
  +
|-
  +
| <code>o</code>
  +
|<code>unsigned int</code> in octal.
 
|-
 
|-
 
| <code>s</code>
 
| <code>s</code>
Line 58: Line 61:
 
| <code>c</code>
 
| <code>c</code>
 
|<code>char</code> (character).
 
|<code>char</code> (character).
  +
|-
  +
| <code>p</code>
  +
|<code>void *</code> (pointer to void) in an implementation-defined format.
  +
|-
  +
| <code>a</code>, <code>A</code>
  +
|<code>double</code> in hexadecimal notation, starting with <code>0x</code> or <code>0X</code>. <code>a</code> uses lower-case letters, <code>A</code> uses upper-case letters.<ref>{{cite web|url=https://www.gnu.org/software/libc/manual/html_node/Table-of-Output-Conversions.html#Table-of-Output-Conversions |title="The GNU C Library Reference Manual", "12.12.3 Table of Output Conversions" |publisher=Gnu.org |date= |accessdate=2014-03-17}}</ref><ref>
  +
[http://www.cplusplus.com/reference/cstdio/printf/ "printf"]
  +
(<code>%a</code> added in C99)
  +
</ref> (C++11 iostreams have a <code>hexfloat</code> that works the same).
  +
|-
  +
| <code>n</code>
  +
| Print nothing, but writes the number of characters successfully written so far into an integer pointer parameter.<br>Java: indicates a platform neutral newline/carriage return.<ref>{{cite web|url=https://docs.oracle.com/javase/tutorial/java/data/numberformat.html|title=Formatting Numeric Print Output |author=|date=|website=The Java Tutorials | publisher=Oracle Inc.|accessdate=19 March 2018}}</ref><br> Note: This can be utilized in [[Uncontrolled format string]] exploits.
 
|}
 
|}

Revision as of 12:39, 6 July 2019

"printf" is a function in the C-standard library that outputs text to standard output. Standard output is typically the terminal or debug console, depending on the system the program is running on. The f stands for formatted, allowing the function to output not just fixed strings, but also text with variable data in it.

Hello world

The simplest of all C-programs is known as "Hello world" program. It outputs "Hello world", using printf.

#include <stdio.h>

int main(void) {
  printf("Hello world!\n");
  return 0;
}

Using parameters

Parameters need to be specified in the format string. A parameter definition starts with a % character. A simple example with one numerical parameter looks as below:

  printf("Total sum is: %d\n", Sum);

Parameter specification

Type specification

Type field

The Type field can be any of:

Character Description
% Prints a literal % character (this type doesn't accept any flags, width, precision, length fields).
d, i int as a signed decimal number. %d and %i are synonymous for output, but are different when used with scanf() for input (where using %i will interpret a number as hexadecimal if it's preceded by 0x, and octal if it's preceded by 0.)
u Print decimal unsigned int.
f, F double in normal (fixed-point) notation. f and F only differs in how the strings for an infinite number or NaN are printed (inf, infinity and nan for f; INF, INFINITY and NAN for F).
e, E double value in standard form ([-]d.ddd e[+/-]ddd). An E conversion uses the letter E (rather than e) to introduce the exponent. The exponent always contains at least two digits; if the value is zero, the exponent is 00. In Windows, the exponent contains three digits by default, e.g. 1.5e002, but this can be altered by Microsoft-specific _set_output_format function.
g, G double in either normal or exponential notation, whichever is more appropriate for its magnitude. g uses lower-case letters, G 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. Also, the decimal point is not included on whole numbers.
x, X unsigned int as a hexadecimal number. x uses lower-case letters and X uses upper-case.
o unsigned int in octal.
s null-terminated string.
c char (character).
p void * (pointer to void) in an implementation-defined format.
a, A double in hexadecimal notation, starting with 0x or 0X. a uses lower-case letters, A uses upper-case letters.[1][2] (C++11 iostreams have a hexfloat that works the same).
n Print nothing, but writes the number of characters successfully written so far into an integer pointer parameter.
Java: indicates a platform neutral newline/carriage return.[3]
Note: This can be utilized in Uncontrolled format string exploits.