Lightweight and with minimal dependencies implementation of snprintf()
C function. Especially it is independend from mathematical functions from math.h
which are not always available for embedded platforms.
From many years I was using almost unchanged orginal implementation of Alain Magloire (v1.1) but last time I needed replacement of snprintf()
function more compliant with standard implementation.
int snprintf (char * string , size_t length , const char * format , ...);
Parameter
Description
string
Output buffer.
length
Size of output buffer string
.
format
Format of input parameters.
...
Input parameters according to format
.
Value
Description
>=0
Amount of characters put (or would be put in case of string
is set to NULL
) in string
.
-1
Output buffer string
size is too small.
Just copy src/snprintf.c
& include/snprintf.h
to your project and include snprintf.h
in your code.
#include <stdio.h>
#include "snprintf.h"
int main (int argc , char * argv []) {
const char * hello = "Hello" , * world = "World" ;
char msg [0x100 ] = "" ;
snprintf (msg , sizeof (msg ), "%s %s!" , hello , world );
printf ("%s\n" , msg );
return 0 ;
}
In src/tests-snprintf.c
& include/tests-snprintf.h
you can find set of tests based on MinUnit engine, which can be run by tests_snprintf()
function.
#include "tests-snprintf.h"
int main (void ) {
return tests_snprintf ();
}
Supported format specifiers
Type
Description
d / i
signed decimal integer
u
unsigned decimal integer
o
unsigned octal integer
x / X
unsigned hexadecimal integer
f / F
decimal floating point
e / E
scientific (exponential) floating point
g / G
scientific or decimal floating point
c
character
s
string
p
pointer
%
percent character
Length
Description
hh
signed / unsigned char
h
signed / unsigned short
l
signed / unsigned long
ll
signed / unsigned long long
Flag
Description
-
justify left
+
justify right or put a plus if number
#
prefix 0x, 0X for hex and 0 for octal
*
width and/or precision is specified as an int argument
0
for number padding with zeros instead of spaces
(space)
leave a blank for number with no sign