variable argument function in C
I have a variable list function
/* vsprintf example */
#include <stdio.h>
#include <stdarg.h&g开发者_运维技巧t;
void PrintFError (char * format, ...)
{
char buffer[50];
va_list args;
va_start (args, format);
vsprintf (buffer,format, args);
perror (buffer);
va_end (args);
}
int main ()
{
FILE * pFile;
char szFileName[]="myfile.txt";
int firstchar = (int) '#';
pFile = fopen (szFileName,"r");
if (pFile == NULL)
PrintFError ("Error opening '%s'",szFileName);
else
{
// file successfully open
fclose (pFile);
}
return 0;
}
In above example how can we check the received message in "PrintError" function that we are not crossing the buffer size in this example 50 while using "vsprintf" in above example. This should be achieved in portable way.
You should use the safer vsnprintf, and limit it to 50 characters maximum.
int vsnprintf(char *str, size_t size, const char *format, va_list args);
You are correct to worry about buffer overflow. You can't do this with vsprintf, but you can with vsnprintf, which includes an argument which is the length of the buffer.
Use vsnprintf()
. It allows you to specify the number of characters to output (n
):
int vsnprintf(char *s, size_t n, const char *format, va_list ap);
You can use vsnprintf. This is, strictly speaking, non-standard unless you have a C99 compiler, but is supported on most environments. If you do not have an implementation of vsnprintf
on your platform, you can simply add a portable implementation to your program.
精彩评论