C++ snprintf()

The snprintf() function in C++ is used to write a formatted string to character string buffer.

Unlike sprintf(), maximum number of characters that can be written to the buffer is specified in snprintf().

snprintf() prototype

int snprintf( char* buffer, size_t buf_size, const char* format, ... );

The snprintf() function writes the string pointed to by format to buffer. The maximum number of characters that can be written is (buf_size-1).

After the characters are written, a terminating null character is added. If buf_size is equal to zero, nothing is written and buffer may be a null pointer.

It is defined in <cstdio> header file.

snprintf() Parameters

  • buffer: Pointer to the string buffer to write the result.
  • buf_size: Specify maximum number of characters to be written to buffer which is buf_size-1.
  • format: Pointer to a null terminated string that is written to the file stream. It consists of characters along with optional format specifiers starting with %.

    The format specifiers are replaced by the values of respective variables that follows the format string.

    The format specifier has the following parts:

    • A leading % sign
    • Flags: Optional one or more flags that modifies the conversion behavior.
      • - : Left justify the result within the field. By default it is right justified.
      • + : The sign of the result is attached to the beginning of the value, even for positive results.
      • Space: If there is no sign, a space is attached to the beginning of the result.
      • # : An alternative form of the conversion is performed.
      • 0 : It is used for integer and floating point number. Leading zeros are used to pad the numbers instead of space.
    • Width: An optional * or integer value used to specify minimum width field.
    • Precision : An optional field consisting of a . followed by * or integer or nothing to specify the precision.
    • Length : An optional length modifier that specifies the size of the argument.
    • Specifier: A conversion format specifier. The available format specifiers are as follows:
      Format Specifier Description
      % Prints %
      c Writes a single character
      s Writes a character string
      d or i Converts a signed integer to decimal representation
      o Converts an unsigned integer to octal representation
      X or x Converts an unsigned integer to hexadecimal representation
      u Converts an unsigned integer to decimal representation
      F or f Converts floating-point number to the decimal representation
      E or e Converts floating-point number to the decimal exponent notation
      A or a Converts floating-point number to the hexadecimal exponent
      G or g Converts floating-point number to either decimal or decimal exponent notation
      n Returns the number of characters written so far by this call to the function. The result is written to the value pointed to by the argument
      p Writes an implementation defined character sequence defining a pointer.

      So the general format of format specifier is: %[flags][width][.precision][length]specifier

  • … : Other additional arguments specifying the data to be printed. They occur in a sequence according to the format specifier.

snprintf() Return value

If successful, the snprintf() function returns number of characters that would have been written for sufficiently large buffer excluding the terminating null character. On failure it returns a negative value.

The output is considered to be written completely if and only if the returned value is nonnegative and less than buf_size.

Example: How snprintf() function works

#include <cstdio>
#include <iostream>

using namespace std;

int main()
{
    char buffer[100];
    int retVal, buf_size = 100;
    char name[] = "Max";
    int age = 23;

    retVal = snprintf(buffer, buf_size, "Hi, I am %s and I am %d years old", name, age);
    if (retVal > 0 && retVal < buf_size)
    {
        cout << buffer << endl;
        cout << "Number of characters written = " << retVal << endl;
    }
    else
        cout << "Error writing to buffer" << endl;

    return 0;
}

When you run the program, the output will be:

Hi, I am Max and I am 23 years old
Number of characters written = 34