
2.5 Функции с переменным количеством параметров
Это функции, в которых количество и типы параметров определяются только во время их вызова. Синтаксис:
тип имя(спецификация явных параметров,...);
Последняя запятая необязательна. Многоточие сообщает компилятору, что не нужно проводить дальнейший контроль соответствия количества параметров и их типов при обработке вызова. Переход в списке от параметра к параметру осуществляется с помощью указателя, тип которого является типом переменной. При увеличении указателя на единицу осуществляется переход к следующей переменной такого же типа. Функции с переменным числом параметров не работают с типами char, unsigned char, float.
В таких функциях существуют два способа определения количества параметров: 1) передача в функцию в списке фактических параметров информации об их количестве; 2) добавление параметра–индикатора в конец списка фактических параметров.
Пример 2.7
#include <stdio.h> |
int sumi(int i,...) |
{int *num=&i; |
int sum=0; |
for(;i;i--) sum+=*(++num); |
return sum;} |
double sumd(int i,double d...) |
{double *ptr=&d; |
double sum=0.0; |
for(;i;i--) sum+=*(ptr++); |
return sum;} |
void main() |
{int a1=10,a2=20,a3=30,s1,s2; |
double d1=5.7, d2=1.2,s3; |
s1=sumi(3,a1,a2,a3); |
s2=sumi(6,1,a2,3,a1,a3,4); |
s3=sumd(4,d1,1.25,d2,2.5); |
printf(“s1=%d s2=%d s3=%.2lfn”, s1,s2,s3); |
} |
|
|
|
Пример 2.8
#include <stdio.h> |
#define term 0.0 |
double mult(double arg...) |
{double a=1.0,*ptr=&arg; |
if(*ptr==term) return 0.0; |
for(;*ptr;ptr++) |
a*=*ptr; |
return a;} |
void main() |
{double a=2.5,b=2.0,md1,md2; |
md1=mult(a,b,0.3,term); |
md2=mult(0.5,a,4.0,b,1.1,term); |
printf("md1=%.2lf md2=%.2lf\n",md1,md2);} |
|
|
|
2.6 Передача параметров в функцию main()
В функцию main() могут передаваться параметры. Для этого функцию main()следует описать в таких формах:
[тип] main(int argc, char **argv){...}
[тип] main(int argc, char **argv, char **envp){...}
[тип] – тип функции main может быть void или int.
Параметр int argc определяет число слов в командной строке.
Параметр char **argv ‑ указатель на массив строк, вводимых из командной строки. Размер этого массива строк равен argc. Нулевое слово, на которое указывает указатель argv[0], всегда является спецификацией запускаемой на выполнение программы (именем программы с расширением .exe).
Параметр char **envp ‑ это указатель на массив указателей на строки среды программы. С помощью этого параметра в программу можно передать всю информацию среде окружения программы, которая определяет некоторые особенности операционной системы и др.
Пример 2.9
#include <stdio.h> |
#include <conio.h> |
int main(int argc,char **argv,char **envp) |
{ char str[]="Secret"; |
if(strcmp(argv[1],str)!=0) |
{printf("Error\n"); getch(); return 1;} |
for(int i=0;i<argc;i++) |
printf("argv[%d]=%s\n",i,argv[i]); |
puts("\nСреда окружения"); |
while(*envp) puts(*envp++); |
getch(); return 0;} |
|
|
|