Va_arg
va_arg, va_end, va_start
Функция Создают список аргументов.
Синтаксис #include
void va_start(va_list param, lastfix); type va_arg(va_list param, type); void va_end(va_list param);
Файл, содержащий stdarg.h прототип
Описание Некоторые СИ-функции, такие как vfprintf и vprintf, принимают переменный список аргументов, в отличие от функций, имеющих фиксированное число аргументов. Макрокоманды семейства va_... обеспе- чивают простой путь доступа к данным спискам ар- гументов. Они используются для перебора аргумен- тов в том случае, когда вызываемая функция не со- общает номер и тип передаваемого аргумента. В за- головочном файле stdarg.h объявлен один тип пере- менного списка аргументов (va_list), и три макро- команды (va_start, va_arg, va_end).
Список va_list.
Данный массив содержит информацию, требуемую va_arg и va_end. При вызове функции с переменным списком аргументов, объявляется переменная param с типом va_list.
va_start Данная подпрограмма (применяемая как макрокоман- да) устанавливает аргумент param в качестве ука- зателя на первый аргумент, передаваемый функции. Заметим, что va_start должна вызываться перед va_arg или va_end. Функция va_start использует два аргумента: param и lastfix (смысл аргумента param объяснен выше в абзаце, посвященном va_list); lastfix - это имя последнего фиксиро- ванного параметра, передаваемого вызванной функ- ции.
va_arg Данная подпрограмма, также используемая, как мак- рокоманда, расширяется до выражения, имеющего тот же тип и значение, что и следующий передаваемый аргумент (один из переменных аргументов). Пара- метр param в подпрограмме va_arg должен быть тем же самым param, который инициализирует подпрог- рамма va_start.
По умолчанию вы можете использовать с va_arg char, unsigned char или float.
Когда va_arg используется первый раз, она возвра- щает первый в списке аргумент. При каждом после- дующем использовании va_arg возвращает следующий по порядку аргумент в списке. Это выполняется посредством обращения к param, и затем присвоения param адреса следующего аргумента. Для этого ис- пользуется параметр type. Каждый успешный вызов подпрограммы va_arg переадресовывает param на следующий аргумент в списке.
va_end Данная макрокоманда способствует нормальному воз- врату вызываемой функции. Макрокоманда va_end мо- жет модифицировать param таким образом, что он не сможет быть использован до вызова va_start. va_end должна быть вызвана после того, как функ- ция va_arg прочтет все аргументы; попытка сделать иначе вызовет непредсказуемое поведение вашей программы.
Возвращаемое Функции va_start и va_end не имеют возвращаемых значение значений; va_arg возвращает текущий аргумент в списке (тот, который адресуется с помощью param).
Переносимость va_arg, va_start, va_end поддерживается на сис- темах UNIX.
Смотрите также Функции .. ..
Пример:
#include
#include
/* вычисляет сумму, завершаемого 0 списка */ void sum(char *msg, ...) { int total = 0; va_list ap; int arg; va_start(ap, msg); while ((arg = va_arg(ap,int)) != 0) { total += arg; } printf(msg, total); }
int main(void) { sum("Сумма 1+2+3+4 = %d\n", 1,2,3,4,0); }
Результат программы
Сумма 1+2+3+4 = 10
Пример 2:
#include
#include
void error(char *format,...) { va_list argptr; print("error: "); va_start(argptr, format); vprintf(format, argptr); va_end(argptr); }
int main(void) { int value = -1; error("this is just an error message\n"); error("invalid value %d encountered\n", value); }
Результат программы:
error: this is just an error message error: invalid value -1 encountered
Vfprintf
vfprintf
Функция Направляет в поток отформатированный вывод.
Синтаксис #include
int vfprintf(FILE *stream, char *format, va_list arglist);
Файл, содержащий stdio.h прототип
Описание Функция v...printf известна как дополнительная точка входа для функций ...printf. Они ведут себя точно также, как и их ...printf-двойники, но они имеют доступ к указателю на список аргументов, а не к самому аргументному списку.
vfprintf осуществляет доступ к указателю на серии аргументов, применяет к каждому аргументу формат- ную спецификацию, содержащуюся в строке формата, на которую указывает format, и осуществляет вывод отформатированных данных в поток. Число специфи- каций формата должно быть равно числу аргументов. Смотри в printf описание информации, включаемой в спецификацию формата.
Возвращаемое vfprintf возвращает число выведенных байтов. В значение случае ошибки vprintf возвращает EOF.
Переносимость vfprintf поддерживается на UNIX System V, и сов- местима с ANSI C.
Смотрите также
Пример:
#include
#include
FILE *fp;
int vfpf(char *fmt, ...); { va_list argptr; int cnt; va_start(argptr,format); cnt = vfprintf(fp,fmt,argptr); va_end(argptr); return cnt; }
int main(void) { int inumber = 30; float fnumber = 90; char string[4] = "abc"; fp = tmpfile(); if(fp == NULL) { perror("Вызов tmpfile"); exit(1); } vfpf("%d %f %s",inumber,fnumber,string); rewind(fp); fscanf("%d %f %s\n",&inumber,&fnumber,string); printf("%d %f %s",inumber,fnumber,string); fclose(fp); return 0; }
Vfscanf
vfscanf
Функция Выполняет форматный ввод из потока.
Синтаксис #include
int vfscanf(FILE *stream, const char *format, va_list arglist);
Файл, содержащий stdio.h прототип
Описание Функции v...scanf известны как дополнительные точки входа для функций ...scanf. Они ведут себя точно также, как и их ...scanf-двойники, но они имеют доступ к указателю на список аргументов, а не к самому аргументному списку.
vfscanf сканирует несколько полей ввода и читает из потока по одному символу в каждый момент вре- мени. Затем каждое поле форматируется в соответс- твии с форматной спецификацией, передавемой в vfscanf в форматной строке, на которую указывает format. И наконец, vfscanf запоминает отформати- рованный ввод по адресу, передаваемому ему в ка- честве аргумента, следующего за format. Число спецификаций формата и адресов должно быть равно числу полей ввода.
Смотри в scanf описание информации, включенной в спецификацию формата.
vfscanf может закончить сканирование конкретного поля, не достигнув нормального символа конца_поля (пробел), или полностью прервать его по ряду при- чин. Смотри в scanf описание различных случаев.
Возвращаемое vfscanf возвращает число входных полей, которые значение были сосканированы, преобразованы и запомнены. Возвращаемое значение не вкдлючает сканированные поля, которые не были запомнены. Если не было сохранено ни одно поле, то возвращаемое значение - 0.
Если vfscanf пытается читать в конце_файла, то возвращаемое значение EOF.
Переносимость vfscanf поддерживается на UNIX System V.
Смотрите также
Пример:
#include
#include
FILE *fp;
int vfsf(char *fmt, ...); { va_list argptr; int cnt; va_start(argptr,format); cnt = vfscanf(fp,fmt,argptr); va_end(argptr); return (cnt); }
int main(void) { int inumber = 30; float fnumber = 90; char string[4] = "abc"; fp = tmpfile(); if(fp == NULL) { perror("Вызов tmpfile"); exit(1); } fprintf(fp,"%d %f %s",inumber,fnumber,string); rewind(fp); vfsf("%d %f %s",&inumber,&fnumber,string); printf("%d %f %s",inumber,fnumber,string); fclose(fp); return 0; }
Vprintf
vprintf
Функция Посылает отформатированный вывод в стандартный по- ток stdout.
Синтаксис #include
int vprintf(const char *format, va_list arglist);
Файл, содержащий stdio.h прототип
Описание Функции v...printf известны как дополнительные точки входа для функций ...printf. Они ведут себя точно также, как и их ...printf-двойники, но они имеют доступ к указателю на список аргументов, а не к самому списку.
vprintf осуществляет доступ к указателю на серии аргументов, применяет к каждому аргументу формат- ную спецификацию, содержащуюся в строке формата, на которую указывает format, и осуществляет вывод отформатированных данных в stdout. Число специфи- каций формата должно быть равно числу аргументов.
Смотри в printf описание информации, включаемой в спецификацию формата.
Возвращаемое vprintf возвращает число выведенных байтов. В значение случае ошибки vprintf возвращает EOF.
Переносимость vprintf поддерживается на UNIX System V, и сов- местима с ANSI C.
Смотрите также
Пример:
#include
int vpf(char *fmt, ...); { va_list argptr; int cnt; va_start(argptr,format); cnt = vprintf(fmt,argptr); va_end(argptr); return(cnt); }
int main(void) { int inumber = 30; float fnumber = 90; char *string = "abc"; vpf("%d %f %s",inumber,fnumber,string); return 0; }
Vscanf
vscanf
Функция Выполняет форматный ввод из стандартного потока stdin.
Синтаксис #include
int vscanf(const char *format, va_list arglist);
Файл, содержащий stdio.h прототип
Описание Функции v...scanf известны как дополнительные точки входа для функций ...scanf. Они ведут себя точно также, как и их ...scanf-двойники, но они имеют доступ к указателю на список аргументов, а не к самому списку.
vscanf сканирует несколько полей ввода и читает из stdin по одному символу в каждый момент време- ни. Затем каждое поле форматируется в соответст- вии с форматной спецификацией, передавемой в vscanf в форматной строке, на которую указывает format. И наконец, vscanf запоминает отформатиро- ванный ввод по адресу, передаваемому ему в качес- тве аргумента, следующего за format. Число специ- фикаций формата и адресов должно быть равно числу полей ввода.
Смотри в scanf описание информации, включенной в спецификацию формата.
vscanf может закончить сканирование конкретного поля, не достигнув нормального символа конца_поля (пробел), или полностью прервать его по ряду при- чин. Смотри в scanf описание различных случаев.
Возвращаемое vscanf возвращает число входных полей, которые значение были сосканированы, преобразованы и запомнены. Возвращаемое значение не включает сканированные поля, которые не были запомнены. Если не было сохранено ни одно поле, то возвращаемое значение - 0.
Если vscanf пытается читать в конце_файла, то возвращаемое значение EOF.
Переносимость vscanf поддерживается на UNIX System V.
Смотрите также
Пример:
#include
#include
int vscnf(char *fmt, ...); { va_list argptr; int cnt; printf("Введите целое, число с плавающей точкой, и строку: \n"); va_start(argptr,format); cnt = vscanf(fmt,argptr); va_end(argptr); return(cnt); }
int main(void) { int inumber = 30; float fnumber = 90; char *string = "abc"; vscnf("%d %f %s",&inumber,&fnumber,string); printf("%d %f %s",inumber,fnumber,string); return 0; }
Vsprintf
vsprintf
Функция Посылает отформатированный вывод в строку.
Синтаксис #include
int vsprintf(char *string, const char *format, va_list arglist);
ФАйл, содержащий stdio.h прототип
Описание Функции v...printf известны как дополнительные точки входа для функций ...printf. Они ведут себя точно также, как и их ...printf-двойники, но они имеют доступ к указателю на список аргументов, а не к самому списку.
vsprintf осуществляет доступ к указателю на серии аргументов, применяет к каждому аргументу формат- ную спецификацию, содержащуюся в строке формата, на которую указывает format, и осуществляет вывод отформатированных данных в строку. Число специфи- каций формата должно быть равно числу аргументов.
Смотри в printf описание информации, включаемой в спецификацию формата.
Возвращаемое vsprintf возвращает число выведенных байтов. В значение случае ошибки vsprintf возвращает EOF.
Переносимость vsprintf поддерживается на UNIX System V, и сов- местима с ANSI C.
Смотрите также
Пример:
#include
#include
char buffer[80];
int vspf(char *fmt, ...); { va_list argptr; int cnt; va_start(argptr,format); cnt = vsprintf(buffer,fmt,argptr); va_end(argptr); return cnt; }
int main(void) { int inumber = 30; float fnumber = 90; char string[4] = "abc"; vspf("%d %f %s",inumber,fnumber,string); printf("%s",buffer); return 0; }
Vsscanf
vsscanf
Функция Выполняет форматный ввод из потока.
Синтаксис #include
int vsscanf(const char *buffer, const char *format, va_list arglist);
Файл, содержащий stdio.h прототип
Описание Функции v...scanf известны как дополнительные точки входа для функций ...scanf. Они ведут себя точно также, как и их ...scanf-двойники, но они имеют доступ к указателю на список аргументов, а не к самому списку.
vsscanf сканирует несколько полей ввода и читает из потока по одному символу в каждый момент вре- мени. Затем каждое поле форматируется в соответс- твии с форматной спецификацией, передавемой в vsscanf в форматной строке, на которую указывает format. И наконец, vsscanf запоминает отформати- рованный ввод по адресу, передаваемому ему в ка- честве аргумента, следующего за format. Число спецификаций формата и адресов должно быть равно числу полей ввода.
Смотри в scanf описание информации, включенной в спецификацию формата.
vsscanf может закончить сканирование конкретного поля, не достигнув нормального символа конца_поля (пробел), или полностью прервать его по ряду при- чин. Смотри в scanf описание различных случаев.
Возвращаемое vsscanf возвращает число входных полей, которые значение были сосканированы, преобразованы и запомнены. Возвращаемое значение не включает сканированные поля, которые не были запомнены. Если не было сохранено ни одно поле, то возвращаемое значение - 0.
Если vsscanf пытается читать в конце_файла, то возвращаемое значение EOF.
Переносимость vsscanf поддерживается на UNIX System V.
Смотрите также
Пример:
#include
#include
char buffer[80] = "30 90.0 abc";
int vssf(char *fmt, ...); { va_list argptr; int cnt; fflash(stdin); va_start(argptr,format); cnt = vsscanf(buffer,fmt,argptr); va_end(argptr); return cnt; }
int main(void) { int inumber; float fnumber; char string[80]; vssf("%d %f %s",&inumber,&fnumber,string); printf("%d %f %s",inumber,fnumber,string); return 0; }