从variadic函数返回格式化字符串

时间:2013-12-04 09:37:46

标签: c++

我有一个具有以下功能体的可变参数 -

char * ReturnMessage1(const char *format,...)
{
    va_list vl;
    int i = 0;
    std::stringstream ss;
    va_start( vl, format );

    switch( format[i] ) {   // Type to expect.
    case 'i':
        {
            int ii = va_arg(vl, int );
            ss << ii;
        }
        break;

    case 'f':
        {
            double f = va_arg(vl, double );         
            ss << f;
        }
        break;

    case 'c':
        {
            char c = va_arg(vl, char );          
            ss << c;
        }
        break;

    case 's':
        {
            char * str = va_arg(vl, char * );            
            ss << str;
        }
        break;

    default:
        break;
    }

    va_end( vl );
    return const_cast<char*>(ss.str().c_str());
}

现在我希望变量sis编译所有参数并形成一个字符串语句并返回它。 BUt它返回一个垃圾字符串。我哪里出错?

1 个答案:

答案 0 :(得分:2)

在函数返回后,您返回的指针无效,因为它指向的对象是函数体的本地对象,并在您离开函数时死亡。

您需要一个动态字符串,最好使用现成的std::string类:

std::string ReturnMessage1(const char *format,...)
{
    std::ostringstream ss;

    //

    return ss.str();
}