Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Ф-я с неограниченным количеством параметров... (http://forum.oszone.net/showthread.php?t=249692)

SAU-trade 21-12-2012 23:42 2050692

Ф-я с неограниченным количеством параметров...
 
Здравствуйте! Кто может разъяснить по функциям с неограниченными параметрами на данном примере
Код:

#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 2053176

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


Время: 07:22.

Время: 07:22.
© OSzone.net 2001-