Параметри функції main( )
Відповідно до синтаксису мови Сі основна функція кожної програми може мати такий заголовок:
int main (int argc, char *argv [ ], char *envp[ ])
Параметр argv - масив покажчиків на рядки; argc - параметр типа int, значення якого визначає розмір масиву argv, тобто кількість його елементів, envp - параметр-масив покажчиків на, символьні рядки, кожна з яких містить опис однієї із змінних середовища (оточення). Під середовищем розуміється та програма (звичайно це операційна система), яка "запустила" на виконання функцію main().
Призначення параметрів функції main() — забезпечити зв'язок виконуваної програми з операційною системою, точніше, з командним рядком, з якого запускається програма і в яку можна вносити дані і тим самим передавати виконуваній програмі будь-яку інформацію.
Якщо усередині функції main() немає необхідності звертатися до інформації з командного рядка, то параметри звичайно опускаються.
Якщо програміст "запускає" програму на мові Сі з інтегрованого середовища розробк (наприклад, Turbo C), то він рідко використовує командний рядок і повинен вживати спеціальні заходам, щоб побачити цей рядок або внести в нього потрібну інформацію. (В Turbo С потрібно в головному меню вибрати пункт RUN, а потім в спадаючому меню вибрати пункт ARGUMENTS...).
При запуску програми з операційної системи командний рядок явно доступний, і саме в ньому записується ім'я виконуваної програми. Вслід за ім'ям можна розмістити потрібну кількість "слів", розділяючи їх один від одного пробілами. Кожне "слово" з командного рядка стає рядком-значенням, на який вказує черговий елемент параметра argv[i], де 0<i<argc. Тут потрібно зробити одне уточнення.
Як і в кожному масиві, в масиві argv[ ] індексація элементів починається з нуля, тобто завжди є елемент argv[0]. Цей елемент є покажчиком на повну назву запускаємої програми. Наприклад, якщо з командного рядка виконується звернення до програми EXAMPLE з каталога CATALOG, розміщеного на диску С, то виклик в MS-DOS виглядає так:
С:\CATALOG\EXAMPLE.ЕХЕ
Значення argc в цьому випадку буде рівне 1, а рядок, який адресує покажчик argv[0], буде таким:
"С:\CATALOG\EXAMPLE.ЕХЕ"
Як ілюстрація сказаного приведемо програму, яка виводить на екран дисплея всю інформацію з командного рядка, розміщуючи кожне "слово" на новому рядку екрану.
#include <stdio.h>
void main (int argc,char *argv[ ])
{
int і ;
for (i=0; i<argc; i++)
printf("\n argv [%d] -> %s", i, argv[i] ;
}
Нехай програма запускається з такого командного рядка:
С:\WP\test66 11 22 33
Результат виконання програми:
argv [0] -> С:\WP\test66.exe
argv [1] -> 11
argv [2] -> 22
argv [3] -> 33
В головній програмі main( ) дозволено використовувати і третій параметр char * envp[ ]. Його призначення - передати в программу всю інформацію про оточення, в якому виконується програма. Наступний приклад ілюструє можливості цього третього параметра основної функції main( ).
#include <stdio.h>
void main (int argc,char *argv[], char *envp[])
{
int n;
printf("\nПрограмма '%s' "
"\nЧисло параметрів при запуску: %d", argv[0], argc-l);
for (n=l; n<argc; n++)
printf("\n%d-й параметр: %s", n, argv[n]);
printf("\n\nСписок змінних оточення:");
for (n=0; envpt[n]; n++)
printf("\n%s", envp[n]);
}
Нехай програма "запущена" на виконання в MS-DOS під Windows 95 з такого командного рядка:
С:\WWP\TESTPROG\MAINENVP.EXE qqq www
Результати виконання програми:
Програма ' С: \WWP\TESTPROG\MAINENVP. ЕХЕ '
Число параметрів при запуску: 2
1-й параметр: qqq
2-й параметр: www
Список змінних оточення:
ТМР=С: \WINDOWS\TEMP
PROMPT=$p$g
winbootdir=C: \WINDOWS
COMSPEC=C:\WINDOWS\COMMAND.COM
TEMP=c:\windows\temp
CLASSPATH=.;c:\cafe\java\lib\classes.zip
HOMEDRIVE=c:
HOMEPATH=\cafe\java
JAVA_HOME=c:\cafe\Java
windir=C: \WINDOWS
NWLANGUAGE=English
PATH=C:\CAFE\BIN; C:\CAFE\JAVA\BIN; C:\BC5\BIN;
C:\WINDOWS; C:\WINDOWS\COMMAND; C:\NC;
C:\ARC;С:\DOS;C:\VLM;C:\TC\BIN
CMDLINE=tC
Через масив покажчиків envp[] програмі доступний набір символьних рядків, створюючих оточення програми. Частіше за все кожний рядок містить таку інформацію:
ім'я_змінної = значення_змінної
Наприклад, в приведених результатах ім'я змінної ТМР пов'язано з ім'ям каталога для тимчасових даних. Змінивши значення змінної ТМР, можна "примусити" програму використовувати для зберігання тимчасових даних інший каталог. Для роботи з рядками оточення в програмах на мові Сі використовують функції getenv() і putenv().