<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Snacks - format</title>
    <subtitle>Snack-size learning for a fast-paced world.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://snacks.devtestonly.uk/tags/format/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://snacks.devtestonly.uk"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-09-30T14:49:54+00:00</updated>
    <id>https://snacks.devtestonly.uk/tags/format/atom.xml</id>
    <entry xml:lang="en">
        <title>C `printf` format cheatsheet</title>
        <published>2026-09-30T14:49:54+00:00</published>
        <updated>2026-09-30T14:49:54+00:00</updated>
        
        <author>
          <name>someone</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://snacks.devtestonly.uk/c/printf-format-cheatsheet/"/>
        <id>https://snacks.devtestonly.uk/c/printf-format-cheatsheet/</id>
        
        <content type="html" xml:base="https://snacks.devtestonly.uk/c/printf-format-cheatsheet/">&lt;h2 id=&quot;1-standard-integers&quot;&gt;1. Standard Integers&lt;/h2&gt;
&lt;p&gt;The size of these types varies depending on your platform (32-bit vs. 64-bit). Using the correct length modifier prevents data truncation or corruption.&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Data Type&lt;/th&gt;&lt;th&gt;Signed Format&lt;/th&gt;&lt;th&gt;Unsigned Format&lt;/th&gt;&lt;th&gt;Safety Notes&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;char&lt;/code&gt; (Used as a number)&lt;/td&gt;&lt;td&gt;&lt;code&gt;%d&lt;/code&gt; or &lt;code&gt;%i&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%u&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Automatically promotes to &lt;code&gt;int&lt;/code&gt; when passed to &lt;code&gt;printf&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;short&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%hd&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%hu&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The &lt;code&gt;h&lt;/code&gt; modifier explicitly tells the compiler it is a short integer.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;int&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%d&lt;/code&gt; or &lt;code&gt;%i&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%u&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The default standard integer format.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;long&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%ld&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%lu&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The &lt;code&gt;l&lt;/code&gt; modifier stands for long.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;long long&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%lld&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%llu&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The &lt;code&gt;ll&lt;/code&gt; modifier is used for extra-large integers (guaranteed at least 64 bits).&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;2-fixed-width-integers&quot;&gt;2. Fixed-Width Integers&lt;/h2&gt;
&lt;p&gt;When using &lt;code&gt;#include &amp;lt;stdint.h&amp;gt;&lt;/code&gt;, these integers have a guaranteed, identical size across all architectures. To print them safely, C uses specific macros available under &lt;code&gt;#include &amp;lt;inttypes.h&amp;gt;&lt;/code&gt;:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Data Type&lt;/th&gt;&lt;th&gt;Signed Format&lt;/th&gt;&lt;th&gt;Unsigned Format&lt;/th&gt;&lt;th&gt;printf Syntax Example&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;int8_t&lt;/code&gt; / &lt;code&gt;uint8_t&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;PRId8&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;PRIu8&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;printf(&quot;Value: %&quot; PRId8 &quot;\n&quot;, var);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;int16_t&lt;/code&gt; / &lt;code&gt;uint16_t&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;PRId16&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;PRIu16&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;printf(&quot;Value: %&quot; PRIu16 &quot;\n&quot;, var);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;int32_t&lt;/code&gt; / &lt;code&gt;uint32_t&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;PRId32&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;PRIu32&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;printf(&quot;Value: %&quot; PRId32 &quot;\n&quot;, var);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;int64_t&lt;/code&gt; / &lt;code&gt;uint64_t&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;PRId64&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;PRIu64&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;printf(&quot;Value: %&quot; PRIu64 &quot;\n&quot;, var);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;3-floating-point-numbers&quot;&gt;3. Floating-Point Numbers&lt;/h2&gt;
&lt;p&gt;An important rule for printf: float arguments are automatically converted (promoted) into double. Because of this, %f safely works for both types.&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Data Type&lt;/th&gt;&lt;th&gt;Standard Format&lt;/th&gt;&lt;th&gt;Scientific Format (e.g., 1.2e+03)&lt;/th&gt;&lt;th&gt;Key Differences&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;float&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%f&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%e&lt;/code&gt; or &lt;code&gt;%g&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%g&lt;/code&gt; automatically selects the shortest representation.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;double&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%f&lt;/code&gt; (or &lt;code&gt;%lf&lt;/code&gt;)&lt;/td&gt;&lt;td&gt;&lt;code&gt;%e&lt;/code&gt; or &lt;code&gt;%g&lt;/code&gt;&lt;/td&gt;&lt;td&gt;While &lt;code&gt;%f&lt;/code&gt; works for printf, the input function scanf strictly requires &lt;code&gt;%lf&lt;/code&gt; for a double.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;long double&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%Lf&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%Le&lt;/code&gt; or &lt;code&gt;%Lg&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Must use a capital &lt;code&gt;L&lt;/code&gt; modifier.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;4-characters-strings-and-pointers&quot;&gt;4. Characters, Strings, and Pointers&lt;/h2&gt;
&lt;p&gt;Handling text and memory addresses poses security risks if incorrect formatting is used.&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Data Type&lt;/th&gt;&lt;th&gt;Safe Format&lt;/th&gt;&lt;th&gt;Safety Notes&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;char&lt;/code&gt; (Character)&lt;/td&gt;&lt;td&gt;&lt;code&gt;%c&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Prints a single ASCII character.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;char*&lt;/code&gt; or &lt;code&gt;char[]&lt;/code&gt; (String)&lt;/td&gt;&lt;td&gt;&lt;code&gt;%s&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The string must end with a null character (&lt;code&gt;\0&lt;/code&gt;). If missing, &lt;code&gt;printf&lt;/code&gt; will read past bounds and crash.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Any Pointer Type&lt;/strong&gt; (Address)&lt;/td&gt;&lt;td&gt;&lt;code&gt;%p&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Prints memory addresses in hexadecimal. Explicitly cast the argument to &lt;code&gt;(void*)&lt;/code&gt; for full compliance.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;5-memory-management-system-adaptive-types-c99&quot;&gt;5. Memory Management &amp;amp; System Adaptive Types (C99+)&lt;/h2&gt;
&lt;p&gt;These specifiers ensure your code compiles and prints safely on both 32-bit and 64-bit systems without manual architecture adjustments:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Data Type&lt;/th&gt;&lt;th&gt;Safe Format&lt;/th&gt;&lt;th&gt;Real-World Use Case&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;size_t&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%zu&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Used for physical object sizes, array capacities, or &lt;code&gt;sizeof&lt;/code&gt; operator returns.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ssize_t&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%zd&lt;/code&gt;&lt;/td&gt;&lt;td&gt;A signed version of &lt;code&gt;size_t&lt;/code&gt; (commonly returned by file system operations like &lt;code&gt;read()&lt;/code&gt; or &lt;code&gt;write()&lt;/code&gt;).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ptrdiff_t&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;%td&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Represents the distance or index difference between two pointers in the same array.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;bulb-general-safety-rules&quot;&gt;💡 General Safety Rules&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;String Protection&lt;/strong&gt;: If a string might lack a &lt;code&gt;\0&lt;/code&gt; terminator, cap the maximum printed width using &lt;code&gt;%.10s&lt;/code&gt; (prints up to 10 characters only).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Literal Percent&lt;/strong&gt;: To display an actual &lt;code&gt;%&lt;/code&gt; symbol on the screen, escape it by doubling it up: &lt;code&gt;%%&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
</feed>
