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。