Is the %zu specifier required for printf? – C

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

Quick Fix: "The %zu specifier is not required for printf in C89. You can use %lu instead to print size_t values.

The Problem:

You are using C89 on an embedded platform and trying to print a size_t variable using printf. The printf function does not recognize the %zu specifier, and instead of printing the value of the variable, it prints zu. Other specifiers work as expected. You wonder if this is a bug in your library implementation or if it’s allowed for a library to exclude the %zu specifier. You want to know if you should contact your library vendor or if there’s another solution to this problem.

The Solutions:

Solution 1: Use of `%lu` specifier

The %zu specifier is a relatively new addition to the printf family, introduced in the C99 standard. It is specifically designed to print size_t variables, which are used to store the size of data types. However, if you are using an older version of C (such as C89) that does not have the %zu specifier, you can still print size_t variables using the %lu specifier. The %lu specifier is used to print unsigned long variables, which are typically large enough to hold size_t values.

Here’s an example of how you can use the %lu specifier to print a size_t variable in C89:

#include <stdio.h>

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

This program will print the value of n as 123.

It is important to note that the %lu specifier should only be used with unsigned long variables. If you try to use it with a signed long variable, you may get unexpected results.

Solution 2: Use the `%zu` specifier to print `size_t` variables

In C89, the `%zu` specifier is required to print `size_t` variables. The `size_t` data type is used to store the size of an object in bytes. It is returned by the `sizeof` operator.

To print a size_t variable, you can use the following format string:

printf("%zu", n);

where n is the size_t variable you want to print.

Here is a corrected version of your code:

#include <stdio.h>

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

This code will print the value of n, which is 123, to the console.

Solution 3: Compiler Update

It is likely not a problem with the library, but rather the compiler. To resolve this issue, update the GCC compiler. After updating the compiler, the program will likely print the expected value.

Here’s a demonstration of the issue and its resolution:

Input Program:

#include <stdio.h>

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

Output with an Older Compiler:

zu

Output after Updating the Compiler:

123

This illustrates that updating the compiler can resolve the issue.