我有一个变量列表功能
/* vsprintf example */
#include <stdio.h>
#include <stdarg.h>
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;
}
在上面的示例中,我们如何在“PrintError”函数中检查收到的消息,我们在此示例中没有超过缓冲区大小50,而在上面的示例中使用“vsprintf”。 这应该以便携方式实现。
答案 0 :(得分:4)
您应该使用更安全的vsnprintf,并将其限制为最多50个字符。
int vsnprintf(char *str, size_t size, const char *format, va_list args);
答案 1 :(得分:1)
你担心缓冲区溢出是正确的。你无法使用vsprintf执行此操作,但可以使用vsnprintf,其中包含一个参数,即缓冲区的长度。
答案 2 :(得分:0)
您可以使用vsnprintf。严格来说,这是非标准的,除非您有C99编译器,但在大多数环境中都受支持。如果您的平台上没有vsnprintf
的实施,则只需在您的计划中添加portable implementation即可。
答案 3 :(得分:0)
使用vsnprintf()
。它允许您指定要输出的字符数(n
):
int vsnprintf(char *s, size_t n, const char *format, va_list ap);