Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Пользователь


Сообщения: 121
Благодарности: 35

Профиль | Отправить PM | Цитировать


Функция является упрощенной учебной реализацией функции 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++ для этих целей рекомендуется использовать аргументы контейнеры.
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:22, 25-12-2012 | #2