Я сделал функцию печати в 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.
Почему это происходит? Я пробовал отладку, но понятия не имею, откуда эта проблема.
Второй аргумент va_start
должен быть последним именованным параметром функции, поэтому используйте:
va_start(ap, s);
va_start()
всегда принимает последний не-многоточечный параметр.