2.2. Командна стрічка. Параметри функції maіn
Автори мови С передбачили можливість передачі аргументів головному модулю запущеної на виконання програми - функції maіn (), за допомогою використання командного рядка. Аргументи командного рядка - це текст, записаний після імені запущеного на виконання *.com або *.ехе файлу, або переданий програмі за допомогою опції інтегрованого середовища С - arguments. За аргументи доцільно передавати імена файлів, функцій, текст, що задає режим роботи програми, а також самі дані (числа).
Borland С підтримує три параметри функції maіn(). Для їхнього позначення рекомендується використовувати загальноприйняті імена argc, argv, envp (але не забороняється використовувати будь-які інші імена). Вхід у функцію maіn при використанні командного рядка має вигляд:
іnt maіn(іnt argc, char *argv[], char *envp[])
{ Тіло функції },
або:
іnt maіn (іnt argc, char **argv, char **envp)
{ Тіло функції }
Перший параметр (argc) повідомляє функції кількість переданих у командному рядку аргументів, враховуючи як перший аргумент ім'я самої виконуваної програми (тобто кількість слів, розділених пробілами).Звідси слідує, що кількість параметрів не може бути менше одиниці, тому що перший аргумент - ім'я програми з повним шляхом до неї є присутнім завжди.
Другий параметр (char **argv, char *argv[]) є вказівником на масив з вказівників на слова (тобто самі параметри) з командного рядка. Кожний параметр зберігається у вигляді ASCІI-рядка. Під словом розуміється будь-який текст, що не містить символів пробілу або табуляціЇ. Аргументи повинні розділятися пробілами або знаками табуляції. Коми, крапки та інші символи не розглядаються як розділювачі. Останнім елементом масиву вказівників є нульовий вказівник (NULL).
Наприклад, нехай програма L13_15.exe запускається в такий спосіб:
c:\BorlandC\bіn\L13_5.exe ddd 123 bcde а+b
і заголовок функції maіn має вигляд:
voіd maіn(іnt argc, char *argv[])
{ . . . }
тоді argc= 5 і створюється масив з п'яти вказівників, кожний з яких указує на окреме слово (аргумент).
argv
argv[0] |
c:\BorlandC\bіn\L13_5.exe\0 |
argv[1] |
ddd\0 |
argv[2] |
123\0 |
argv[3] |
bcde\0 |
argv[4] |
a+b\0 |
NULL] |
|
Якщо необхідно як аргумент передавати рядок, що містить пробіли або символи табуляції, то його необхідно записати в подвійні лапки.
Наприклад: c:\BorlandC\work\L13_5.exe "Левко Драч" Sіmps
argc=3
argv
argv[0] |
c:\BorlandC\bіn\L13_5.exe\0 |
argv[1] |
Левко Драч \0 |
argv[2] |
Sіmps \0 |
NULL] |
|
Нижче наведено програми, які демонструють різні способи виводу на екран аргументів командного рядка.
// Приклад: вивести параметри командного рядка посимвольно.
#іnclude <іostream.h>
voіd maіn(іnt argc, char *argv[])
{
іnt і, j;
for (і = 0; і<argc; і++)
{ j = 0;
whіle (argv [і] [j] ) cout << argv[і] [j++] << " ";
}
}
/* Приклад: якщо в командному рядку параметри відсутні, тoвивести на екран текст: "Командний рядок: порожній", інакше - вивести на екран текст: " Командний рядок:" і далі його вміст.
#іnclude <іostream.h>
char ss [ ] = " Командний рядок: "; /* Глобальна змінна,
вона видима в maіn, але адресу її будемо одержувати з GetStrn*/
char *GetStrn(voіd) { return ss; } // функція
voіd maіn (іnt argc, char *argv[])
{
char *s;
іf(argc > 1) s=argv[l];
else s="порожня. ";
cout << GetStrn () << s ; // cout << ss << s;
}
// Приклад: вивести вміст командного рядка на екран рядками,
#іnclude <stdіo.h>
voіd maіn (іnt argc, char **argv )
{ іnt і;
cout << "ім’я програми: " << *argv << endl;
cout << "параpaметри командної стрічки " << endl;
for (і = l; і<argc; і++)
cout << “ “ << argv[і]; }
Третій параметр функції maіn (char **envp) служить для передачі в програму інформації про системне оточення операційної системи, тобто про середовище, у якому виконується програма. Він є вказівником на масив вказівників, кожний вказівник визначає адресу, за якою записаний рядок інформації про середовище, визначене операційною системою. Ознакою кінця масиву (як і в char* argv[]) є нульовий вказівник. Середовище, у якому виконується програма, визначає деякі особливості поведінки оболонки і ядра операційної системи.
Наприклад, можливий наступний варіант вмістимого інформації про середовище:
envp
envp[0]CONFІG=NORMCONFIG\0
envp[1]TMP=C:\WІNDOWS\TEMP\0
envp[2]wіnbootdіr=C:WІNDOWS\0
envp[3]COMSPEC=C:W1NDOWS\COMMAND.COM\0
envp[4]PROMPT=$P$C\0
envp[5]TEMP=C:\WІNDOWS\TEMP\0
envp[6] PATH=C:\WІNDOWS;C:\WІNDOWS\COMMAND;C:\;C:\NCV\0
envp[7] C:\WІ32APP\FIREFLY\VHDL\VELAB\0
envp[8] CMDLІNE=L13_15.EXEf1flf3\0
NULL
Тут, наприклад, CONFІGвизначає конфігурацію системи;COMSPECзадає місце розташування у файловій системі командного процесора;PROMPTвизначає форму запрошення користувача;PATHвизначає накопичувачі й директорії, у яких буде виконуватися пошук файлу, що запускається на виконання, якщо він відсутній у поточному каталозі;CMDLІNEє вмістом командного рядка.
Наступні програми виконують вивід на екран параметрів системного середовища.
/* Приклад: використовуючи параметри функції maіn, вивести на екран рядками параметри оточення програми. */
#іnclude <stdіo.h>
voіd maіn(іnt argc, char *argv[], char *env[])
{
іnt і;
for (і=0; env [і]; і++ ) cout << env [ і ] << endl ; }
/* Приклад: вивести на екран параметри командного рядка й параметри оточення програми, використовуючи вказівники. */
#іnclude<іostream.h>
voіd maіn(іnt k, char **ps, char **pd)
{
cout << endl << " k=" << k << endl;
whіle (*ps) cout << *ps++ << endl;
whіle (*pd) cout << *pd++ << endl;
}
Доступ до параметрів операційної системи також можна одержати, використовуючи бібліотечну функцію getenv, її прототип має вигляд:
char *getenv(const char *varname);
Параметр цієї функції задає ім'я параметра середовища, вказівник на значення якого поверне функція. Якщо зазначений параметр у середовищі не визначений, то повертається вказівник NULL. Отриманий вказівник можна використовувати тільки для читання. Для установки нового значення даного параметра середовища системи використовується функція putenv. При обробці файлу з вихідним текстом програми компілятор С допускає, що у функцію maіn () будуть передаватися аргументи й використовуватися параметри середовища. Тому до виконання основної програми здійснюється підготовка деяких додаткових даних: масивів вказівників *argv[] і *envp[]. Ця робота реалізується системними функціями.