C ++ - Va_List(变量数参数)无法正确转换

时间:2014-06-16 11:36:06

标签: c++ parameters variadic-functions

我在C ++中创建了一个打印函数,它应该是std::cout的一个更好的替代品,它与C中的printf函数非常相似。

问题是它接收到可变数量的参数,但使用不正确。

这是源代码:

void print(string s, ...)
{
    int len = s.length();
    int pSum = 0;
    for (int i = 0; i < len; i++)
    {
        if (s[i] == '%' && i < len - 1)
        {
            char c = s[i + 1];
            if (c == 'd' || c == 'i' || c == 's') pSum++;
        }
    }
    va_list ap; // Initialization of the VA list
    va_start(ap, pSum); // Start iterating through the VA list
    int r;
    for (int i = 0; i < len; i++)
    {
        if (s[i] == '%' && i < len - 1) // Check for % in the string
        {
            char c = s[i + 1];
            if (c == 'i') 
            {
                r = va_arg(ap, int);
                cout << r;
                i++;
            }
        }
        else cout << s[i];
    }
    va_end(ap); // Stop iterating over the VA list
    fflush(stdout); // Flush standard output stream
}

我测试了这个函数调用的代码:

print("The number %i is the only even prime number.", 2);

输出结果为:

The number -858993460 is the only even prime number.

为什么会这样?我已经尝试过调试,但完全不知道这个问题来自哪里。

1 个答案:

答案 0 :(得分:2)

va_start的第二个参数应该是函数的最后一个命名参数,所以使用:

va_start(ap, s);

Live example