How to append strings using sprintf?
I am facing a serious issue with sprintf
.
Suppose my code snippet is:
sprintf(Buffer,"Hello World");
sprintf(Buffer,"Good Morning");
sprintf(Buffer,"Good Afternoon");
.
.
.
Some hundred sprints....
If I do like this, it's getting overwritten.
How can I avoid overwriting using sprintf
? If I give a printf
at the end I want to see all the lines.
Solution 1:
You need:
sprintf(Buffer,"Hello World");
sprintf(Buffer + strlen(Buffer),"Good Morning");
sprintf(Buffer + strlen(Buffer),"Good Afternoon");
and of course you need your buffer to be big enough.
Solution 2:
int length = 0;
length += sprintf(Buffer+length, "Hello World");
length += sprintf(Buffer+length, "Good Morning");
length += sprintf(Buffer+length, "Good Afternoon");
Here is a version with some resistance to errors. It is useful if you do not care when errors happen so long as you can continue along your merry way when they do.
int bytes_added( int result_of_sprintf )
{
return (result_of_sprintf > 0) ? result_of_sprintf : 0;
}
int length = 0;
length += bytes_added(sprintf(Buffer+length, "Hello World"));
length += bytes_added(sprintf(Buffer+length, "Good Morning"));
length += bytes_added(sprintf(Buffer+length, "Good Afternoon"));
Solution 3:
For safety (buffer overflow) I recommend to use snprintf()
const int MAX_BUF = 1000; char* Buffer = malloc(MAX_BUF); int length = 0; length += snprintf(Buffer+length, MAX_BUF-length, "Hello World"); length += snprintf(Buffer+length, MAX_BUF-length, "Good Morning"); length += snprintf(Buffer+length, MAX_BUF-length, "Good Afternoon");
Solution 4:
A snprintfcat()
wrapper for snprintf()
:
size_t
snprintfcat(
char* buf,
size_t bufSize,
char const* fmt,
...)
{
size_t result;
va_list args;
size_t len = strnlen( buf, bufSize);
va_start( args, fmt);
result = vsnprintf( buf + len, bufSize - len, fmt, args);
va_end( args);
return result + len;
}
Solution 5:
Use the return value of sprintf()
Buffer += sprintf(Buffer,"Hello World");
Buffer += sprintf(Buffer,"Good Morning");
Buffer += sprintf(Buffer,"Good Afternoon");