繁体   English   中英

C中的可变参数函数

[英]variable argument function in 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”时,我们在示例50中未超过缓冲区大小。 这应该以可移植的方式实现。

您应该使用更安全的vsnprintf,并将其限制为最多50个字符。

int vsnprintf(char *str, size_t size, const char *format, va_list args);

您担心缓冲区溢出是正确的。 您不能使用vsprintf来做到这一点,但是可以使用vsnprintf来做到这一点,它包括一个参数,该参数是缓冲区的长度。

您可以使用vsnprintf 严格来说,这是非标准的,除非您具有C99编译器,但大多数环境都支持。 如果您的平台上没有vsnprintf的实现,则只需将可移植的实现添加到程序中即可。

使用vsnprintf() 它允许您指定要输出的字符数( n ):

int vsnprintf(char *s, size_t n, const char *format, va_list ap);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM