如何通过可变数量的参数对printf / sprintf的 [英] How to pass variable number of arguments to printf/sprintf

查看:236
本文介绍了如何通过可变数量的参数对printf / sprintf的的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个保存了错误功能,将格式化一些文本类。我想接受可变数量的参数,然后用printf格式化。

示例:

  MyClass类
{
上市:
    无效错误(为const char *格式,...);
};

的错误方法应采取的参数,调用printf / sprintf的格式化,然后用它做什么。我不想写所有的格式化自己,所以是有意义的尝试,并找出如何利用现有的格式。


解决方案

 无效错误(为const char *格式,...)
{
    焦炭DEST [1024 * 16];
    va_list的argptr;
    的va_start(argptr,格式);
    vsprintf中(DEST,格式,argptr);
    va_end用来(argptr);
    的printf(DEST);
}

这code不是那么好。它使用一个固定大小的字符缓冲区可导致缓冲区溢出错误,如果字符串是病理长。对任意大 1024 * 16 尺寸应掀起一个标志在你的头上。此外,如果 DEST 结束了含有格式codeS的的printf 通话可能会遇到的问题。更好的是的printf(%S,DEST)。但更重要的仍然是使用 vprintf vfprintf

 无效错误(为const char *格式,...)
{
    va_list的argptr;
    的va_start(argptr,格式);
    vfprintf(标准错误,格式,argptr);
    va_end用来(argptr);
}

如果你想操作字符串您显示之前和真的需要它存储在缓冲区第一,请请请使用 vsnprintf 而不是 vsprintf中 vsnprintf 将prevent意外缓冲区溢出错误。

I have a class that holds an "error" function that will format some text. I want to accept a variable number of arguments and then format them using printf.

Example:

class MyClass
{
public:
    void Error(const char* format, ...);
};

The Error method should take in the parameters, call printf/sprintf to format it and then do something with it. I don't want to write all the formatting myself so it makes sense to try and figure out how to use the existing formatting.

解决方案

Bad

void Error(const char* format, ...)
{
    char dest[1024 * 16];
    va_list argptr;
    va_start(argptr, format);
    vsprintf(dest, format, argptr);
    va_end(argptr);
    printf(dest);
}

This code is not so good. It uses a fixed-size character buffer which can lead to a buffer overrun error if the string is pathologically long. The arbitrary large 1024*16 size should set off a flag in your head. Also, the printf call could run into problems if dest ends up containing formatting codes. Better would be printf("%s", dest). But even better still would be using vprintf or vfprintf:

Good

void Error(const char* format, ...)
{
    va_list argptr;
    va_start(argptr, format);
    vfprintf(stderr, format, argptr);
    va_end(argptr);
}

If you want to manipulate the string before you display it and really do need it stored in a buffer first, please please please use vsnprintf instead of vsprintf. vsnprintf will prevent an accidental buffer overflow error.

这篇关于如何通过可变数量的参数对printf / sprintf的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆