Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SIT.doc
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
349 Кб
Скачать

Функции c произвольным числом параметров

Обычно число параметров функции равно числу аргументов, передаваемых вызываемую функцию. Однако С разрешает использовать функции с произвольным числом параметров. Примерами таких функций могут быть библиотечные функции printf и scanf. Сам программист также может определить свои функции с переменным числом параметров. Для этого нужно подключить файл stdarg.h, в котором предусмотрены макросы, поддерживающие механизм использования функций с переменным числом параметров.

Рассмотрим на примере определение функции с переменным числом параметров:

Программа 5.12

Строки программы

Комментарии

1

#include <stdio.h>

#include <stdarg.h>

//calculate sum of a 0 terminated list

Подключаем файл stdarg.h

2

Void sum(char *msg, ...)

Описываем функцию с переменным числом параметров. Список параметров должен содержать по крайней мере один , параметр и должен завершаться многоточием. При этом запятая после последнего фиксированного параметра перед многоточием необязательна, т.е. допускается запись void sum(char *msg ...)

3

{int total=0;

4

va_list ap;

Объявляем переменную типа va_list. Это делается для того, чтобы иметь доступ к аргументам, следующим за последним названным параметром. Этот тип va_list определен в файле stdarg.h. Объявив таким образом переменную ар типа va_list мы создаем возможность для этой переменной содержать адрес одного из аргументов, следующего за последним названным аргументом.

5

int arg;

6

va_start(ap, msg);

Макрос va_start(ap, msg) производит инициализацию механизма доступа к нефиксированным параметрам, причем первый аргумент - это аргумент типа va_list, а второй - последний названный параметр. При этом в переменной ар будет храниться адрес переменной, следующей за переменной msg

7

while ((arg = va_arg(ap,int)) != 0) {

Чтобы получить значение переменной arg, объявленной целой, и передвинуться к следующему адресу (т.е. к адресу, следующей целой переменно), мы должны использовать макрос va_arg(ap,int), т.е. макрос va_arg(ap,int) выдает значение, хранящееся по адресу ар, и одновременно меняет адрес ар на адрес следующего неназванного параметра функции

8

total+=arg;}

printf(msg, total);

9

Va_end(ap)

Макрос va_end(ap) завершает работу c переменной типа va_list

10

int main(void) {

sum(" The total of 1+2+3+4 is %d\n",

1,2.3,4,0);

return 0; }

В функции main происходит вызов функции sum с произвольным числом параметров. Индикатором конца списка параметров служит 0

Как уже было сказано, примером функции с произвольным числом параметров является функция printf, которая описывается следующим образом:

int printf(const char *format[, argument, ...]);

Приведем пример программы, в которой организуем свою функцию printc, предназначенную для вывода символов по формату %с:

Программа 5.13:

#include <conio.h>

#include <string.h>

#include <stdarg.h>

va_sist args;

va_start(args,s);

int len=strlen(s);

int was = 0;

for(int i=0;i<len;i++) {

if (was) {

was 0;

if (s[i]== 'c') {putch(va_arg(args,char));}

else {putch('%'); putch(s[i]);}

}

else {if ((s[i]=='%')&&(i != len)) was=l;

else putch(s[i]);

}

void mail() {

char k=’z’;

printc (“%c12%c”, k, w’);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]