C中的变量参数函数

时间:2011-01-13 15:03:30

标签: c++ c

我有一个变量列表功能

/* 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”。 这应该以便携方式实现。

4 个答案:

答案 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);