C++ C语言中的变元函数

C++ C语言中的变元函数,c++,c,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 (buff

我有一个变量列表函数

/* 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;
 }
/*vsprintf示例*/
#包括
#包括
void PrintFError(字符*格式,…)
{
字符缓冲区[50];
va_列表参数;
va_开始(参数,格式);
vsprintf(缓冲区、格式、参数);
缓冲区;
va_端(args);
}
int main()
{
文件*pFile;
char szFileName[]=“myfile.txt”;
int firstchar=(int)#;
pFile=fopen(szFileName,“r”);
if(pFile==NULL)
PrintFError(“打开“%s”时出错,szFileName);
其他的
{
//文件已成功打开
fclose(pFile);
}
返回0;
}
在上面的示例中,当在上面的示例中使用“vsprintf”时,我们如何在“printerro”函数中检查接收到的消息,即我们在本例中没有超过缓冲区大小50。
这应该以可移植的方式实现。

您担心缓冲区溢出是正确的。使用vsprintf无法做到这一点,但可以使用,其中包括一个参数,该参数是缓冲区的长度。

您担心缓冲区溢出是正确的。vsprintf不能执行此操作,但可以使用,其中包括一个参数,该参数是缓冲区的长度。

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

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

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

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

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

int vsnprintf(char *str, size_t size, const char *format, va_list args);
使用。它允许您指定要输出的字符数(
n
):

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


或者vfprintf后跟perror(NULL),如果您只需要打印消息(而不是将其保存在某些变量中),请使用
vprintf
(或者
vfprintf
,如果您想打印标准错误或其他文件),而不是
vsprintf
:它将直接打印错误,而不是将它保存在变量中,并且注意如果vStavtf设置了ErNO,那么您的错误消息将不合适。为什么要在这个问题上加上C++标签?C和C++是完全不同的语言。@二进制忧愁:因为这些函数在C++中是有效的,虽然它们不太必要,通常是泄密的。或者VFPrTNF后面是PrRor(null),如果你需要打印消息(而不是保存在一些变量中),请使用<代码> vPrimtf(或
vfprintf
如果要在标准错误或其他文件上打印)代替<代码> vStAMTF:它将直接打印错误,而不是将它保存在变量中。注意,如果VSCAPTF设置了ErNO,那么错误消息将不合适。为什么要在这个问题上加上C++标签?C和C++是完全不同的语言。@二进制担忧器:因为这些函数在C++中是有效的,尽管它们是MU。ch不太必要,而且通常不鼓励。是否可以用便携方式实现C99是一个认可的标准,所以严格来说,vsnprintf是标准的。@史蒂夫,我想,但是在C89中,那些不会实现vsnprintf的编译器,今天可能还没有来得及实现C99。是否可以用便携方式实现C99 I“这是一个已批准的标准,所以严格地说,vsnprintf是标准的。@我想,史蒂夫,但是在C89中,那些不会实现vsnprintf的编译器,今天可能还没有来得及实现C99。