Войти

Показать полную графическую версию : Ф-я с неограниченным количеством параметров...


SAU-trade
21-12-2012, 23:42
Здравствуйте! Кто может разъяснить по функциям с неограниченными параметрами на данном примере

#include<iostream>
#include<cstdarg>
#include<string>

using namespace std;

void print(char *str,...)
{
va_list arg_ptr;
va_start(arg_ptr,str);
while(*str!='\0')
{
if (*str!='%') cout << *str;
if (*str=='%'){
str++;
switch (*str){
case 'd': cout << va_arg(arg_ptr,int);
break;
case 'c': cout << (char)va_arg(arg_ptr,int);
break;
case 's': cout << va_arg(arg_ptr,char*);
break;
default:
break;
}
}
str++;
}
va_end(arg_ptr);
}

int main(){

print("I want to print %d parametrs", 4);
print("I want to add %s in this text", "word")
print("I want to print this %c symbol", '$')
}

torauma
25-12-2012, 15:22
Функция является упрощенной учебной реализацией функции printf()

#include<iostream>
#include<cstdarg>
#include<string>

using namespace std;

void print(char *str,...)
/* Первый аргумент объявляется явно и обязательно передается при вызове функции.
Он является единственным явно указанным аргументом, а значит он должен быть
передан макросу va_start для инициализации списка неизвестных аргументов. Если бы
явно указанных аргументов было несколько, то макросу va_start передавался бы
последний явно заданный аргумент. */
{
va_list arg_ptr; // Список аргументов
va_start(arg_ptr,str); // Инициализация списка аргументов
while(*str!='\0')
{
if (*str!='%') cout << *str;
if (*str=='%'){
str++;
switch (*str){
/* Если в str встретилась последовательность '%d', то из списка аргументов
извлекается очередной элемент, считая что он является int. */
case 'd': cout << va_arg(arg_ptr,int);
break;
/* Если в str встретилась последовательность '%c', то из списка аргументов
извлекается очередной элемент, считая что он является int.
Используется тип int т.к. тип char может не поддерживаться
реализацией макроса va_arg*/
case 'c': cout << (char)va_arg(arg_ptr,int);
break;
/* Если в str встретилась последовательность '%s', то из списка аргументов
извлекается очередной элемент, считая что он является указателем. */
case 's': cout << va_arg(arg_ptr,char*);
break;
default:
break;
}
}
str++;
}
/* Если в функции был использован макрос va_start, то перед ее завершением
обязательно нужно вызвать макрос va_end. */
va_end(arg_ptr);
}

int main(){

print("I want to print %d parametrs", 4);
print("I want to add %s in this text", "word")
print("I want to print this %c symbol", '$')
}

Обратите внимание, что функции с неизвестным числом параметров являются инструментом языка C. В C++ для этих целей рекомендуется использовать аргументы контейнеры.




© OSzone.net 2001-2012