Is the %zu specifier required for printf? – C

Photo of author
Written By M Ibrahim
.htaccess c-libraries c89 printf size-t

Quick Fix: In C89, the %zu format specifier is not available. To print size_t values, use %lu and cast the value to unsigned long.

The Solutions:

Solution 1: Use fallback types

In C89, the %zu format specifier is not available because the z length modifier was introduced in C99. However, you can use fallback types to print size_t variables:

#include <stdio.h>

int main(void) {
    size_t n = 123;
    printf("%lu\n", (unsigned long)n); // Use %lu for unsigned long
    return 0;
}

Solution 2: Use sizeof() with %zu specifier

The code provided improperly attempted to print the value of n. The %zu specifier is used to print the size of a variable, not its value. To print the size of n, use sizeof(n):

#include <stdio.h>

int main(void) {
  size_t n = 123;
  printf("%zu\n", sizeof(n));
  return 0;
}

This code will correctly print the size of n, which is typically 8 bytes on most modern systems.

Solution 3:

In this case, the issue is not with the library but the compiler. The GCC compiler requires the %zu specifier to print a size_t variable. Updating the GCC compiler should resolve the issue.