C ++ - Va_List (параметры числа переменных) не приводится правильно

0

Я сделал функцию печати в C++, которая должна быть лучшей альтернативой std::cout, и она очень похожа на функцию printf в C.

Проблема в том, что он получает переменное количество параметров, но использует их неправильно.

Здесь исходный код:

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
    [OT]: С вариационным шаблоном у вас будет более безопасный тип.
Теги:
variadic-functions
parameters

1 ответ

2
Лучший ответ

Второй аргумент va_start должен быть последним именованным параметром функции, поэтому используйте:

va_start(ap, s);

Живой пример.

  • 0
    О, спасибо большое ... Я думал, что вы должны передать число параметров, полученных во втором аргументе в va_start, как я видел в других примерах. Не знаю, почему здесь по-другому, но это работает. Большое спасибо еще раз!
  • 0
    @Travier Такие примеры должны быть неверными (если последний параметр не является числом конечных). va_start() всегда принимает последний не-многоточечный параметр.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню