Аргументи функції main c visual studio. Аргументи функції MAIN()

Необов'язкові та іменовані аргументи

Необов'язкові аргументи

У версії C# 4.0 впроваджено новий засіб, що підвищує зручність вказівки аргументів під час виклику методу. Цей засіб називається необов'язковими аргументамиі дозволяє визначити значення стандартного значення для параметра методу. Це значення буде використовуватися за промовчанням у тому випадку, якщо для параметра не вказано відповідний аргумент під час виклику методу. Отже, вказувати аргумент для такого параметра необов'язково. Необов'язкові аргументи дозволяють спростити виклик методів, де до деяких параметрів застосовуються аргументи за замовчуванням. Їх можна використовувати як " скороченої " форми перевантаження методів .

Головним стимулом додавання необов'язкових аргументів стала необхідність спрощення взаємодії з об'єктами СОМ. У кількох об'єктних моделях Microsoft (наприклад, Microsoft Office) функціональність надається через об'єкти СОМ, багато з яких були написані давно та розраховані на використання необов'язкових параметрів.

Приклад використання необов'язкових аргументів наведено нижче:

Using System; використовуючи System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 ( class Program ( // Аргументи b і с вказувати при виклику необов'язково static int mySum (int a, int b = 5, int c = 10) ( return a + b + c; ) static void Main () ( int sum1 = mySum(3); int sum2 = mySum(3,12); Console.WriteLine("Sum1 = "+sum1); Console.WriteLine("Sum2 = "+sum2);

Слід пам'ятати, що це необов'язкові аргументи повинні обов'язково вказуватися праворуч від обов'язкових. Крім методів, необов'язкові аргументи можна застосовувати у конструкторах, індексаторах та делегатах.

Перевага необов'язкових аргументів полягає, зокрема, у тому, що вони спрощують програмування поводження зі складними викликами методів і конструкторів. Адже нерідко в методі доводиться ставити більше параметрів, ніж потрібно. І в подібних випадках деякі з цих параметрів можуть бути необов'язковими завдяки акуратному застосуванню необов'язкових аргументів. Це означає, що передавати потрібно лише ті аргументи, які важливі у цьому конкретному випадку, а не всі аргументи, які інакше повинні бути обов'язковими. Такий підхід дозволяє раціоналізувати метод і спростити програму поводження з ним.

Іменовані аргументи

Ще однією функціональною можливістю, Яка додалася в C# з виходом версії.NET 4.0, є підтримка так званих іменованих аргументів (named arguments). Як відомо, при передачі аргументів методу порядок їхнього слідування, як правило, повинен збігатися з тим порядком, в якому параметри визначені в самому методі. Іншими словами, значення аргументу надається параметру за його позицією у списку аргументів.

Це обмеження покликані подолати названі аргументи. Іменований аргумент дозволяє вказати ім'я того параметра, якому надається його значення. І в цьому випадку порядок дотримання аргументів уже не має жодного значення. Таким чином, іменовані аргументи певною мірою схожі на згадані раніше ініціалізатори об'єктів, хоч і відрізняються від них своїм синтаксисом. Для вказівки аргументу на ім'я служить наступна форма синтаксису:

ім'я_параметра: значення

Тут ім'я_параметрапозначає ім'я параметра, якому передається значення. Вочевидь, имя_параметра має позначати ім'я дійсного параметра для методу.

Буває, що дані до програми передаються з командного рядка під час її виклику. Такі дані називаються аргументами командного рядка. Виглядає це так, наприклад:

./a.out test.txt ls -lt /home/peter/

Тут викликаються програми a.out (з поточного каталогу) та ls (з одного каталогу, вказаного у змінному оточенні PATH). Перша програма з командного рядка отримує одне слово – test.txt, друга – два: -lt та /home/peter/.

Якщо програма написана мовою C, то при її запуску керування відразу передається у функцію main() , отже, саме вона отримує аргументи командного рядка, які надаються її змінним параметрам.

До цього ми визначали функцію main() так, ніби вона не приймає жодних параметрів і нічого не повертає. Насправді, у мові C будь-яка функція за замовчуванням (якщо не визначено нічого іншого) повертає ціле число. У цьому можна переконатись. Якщо записати код таким чином:

main() ( printf ("Hi \n "); return 0; )

То жодного попередження чи помилки при компіляції не виникне. Те саме буде, якщо записати int main() . Це доводить, що функція за замовчуванням повертає ціле число, а чи не ніщо (void). Хоча те, що функція повертає завжди можна "перевизначити", наприклад, voidmain() або float main() .

При виклику програми з командного рядка до неї завжди передається пара даних:

  1. ціле число, що позначає кількість слів (елементів, розділених пробілами) у командному рядку під час виклику,
  2. вказівник на масив рядків, де кожен рядок – це окреме слово з командного рядка.

Слід пам'ятати, що саме ім'я програми також вважається. Наприклад, якщо виклик виглядає так:

./a.out 12 theme 2

Перший аргумент програми має значення 4, а масив рядків визначається як ("./a.out", "12", "theme", "2").

Зверніть увагу на термінологію, є всього два аргументи програми (число та масив), але скільки завгодно аргументів командного рядка. Аргументи командного рядка "перетворюються" на аргументи програми (в аргументи функції main()).
Ці дані (число і покажчик) передаються в програму навіть тоді, коли вона просто викликається на ім'я без передачі в неї чого-небудь: ./a.out. У такому разі перший аргумент має значення 1, а другий вказує на масив, що складається всього з одного рядка ("/a.out").

Те, що в програму передаються дані, не означає, що функція main() повинна їх приймати. Якщо функцію main() визначено без параметрів, отримати доступ до аргументів командного рядка неможливо. Хоча нічого вам не заважає їх передавати. Помилки не виникне.

Щоб отримати доступ до переданих у програму даних, їх потрібно присвоїти змінним. Оскільки аргументи відразу передаються в main(), то її заголовок має виглядати таким чином:
main (int n, char *arr)

У першій змінній (n) міститься кількість слів, а в другій – покажчик на масив рядків. Часто другий параметр записують як **arr . Однак це те саме. Згадаймо, що сам масив рядків містить в якості своїх елементів покажчики на рядки. А на функцію ми передаємо покажчик на перший елемент масиву. Виходить, передаємо покажчик на покажчик, тобто. **arr.

Завдання
Напишіть таку програму:

#include int main(int argc, char ** argv) ( int i; printf ("%d \n ", argc); for (i= 0; i< argc; i++ ) puts (argv[ i] ) ; }

Вона виводить кількість слів у командному рядку під час її виклику та кожне слово з нового рядка. Викличте її без аргументів командного рядка та з аргументами.

У програмі ми використовували змінні параметри argc і argv. Прийнято використовувати саме такі імена, але вони можуть бути будь-якими. Краще дотримуватися цього стандарту, щоб ваші програми були зрозумілішими не тільки вам, але й іншим програмістам.

Практичне значення передачі в програму

Якщо у вас є досвід роботи в командному рядку GNU/Linux, ви знаєте, що більшість команд мають ключі та аргументи. Наприклад, при перегляді вмісту каталогів, копіюванні, переміщенні як аргументи вказуються об'єкти файлової системинад якими виконується команда. Особливості виконання визначаються за допомогою ключів. Наприклад, у команді

Cp -r ../les_1 ../les_101

cp – це ім'я команди, -r – ключ, а../les_1 та../les_101 – аргументи команди.

Взагалі найчастіше програми при їх запуску передаються адреси файлів і "модифікатори" (це ключі) процесу виконання програми.

Напишемо програму, яка відкриває вказані користувачем у командному рядку файли на запис або додавання і записує (додає) туди одну й ту саму інформацію, яку користувач вводить з клавіатури в процесі виконання програми:

#include #include main (int argc, char ** argv) ( int i, ch; FILE * f [ 5 ] ; if (argc< 3 || argc >7 ) ( puts ( "Неправильна кількість параметрів"); return 1; ) if (strcmp (argv[ 1 ] , "-w" ) != 0 && strcmp (argv[ 1 ] , "-a" ) != 0 ) ( puts ( "Перший параметр може бути -w, або -a"); return 2; ) for (i = 0; i< argc- 2 ; i++ ) { f[ i] = fopen (argv[ i+ 2 ] , argv[ 1 ] + 1 ) ; if (f[ i] == NULL) { printf ("Файл %s не можна відкрити\n", argv [i + 2]); return 3; ) ) while ((ch = getchar () )! = EOF) for (i = 0; i< argc- 2 ; i++ ) putc (ch, f[ i] ) ; for (i= 0 ; i < argc- 2 ; i++ ) fclose (f[ i] ) ; return 0 ; }

Пояснення до коду:

  1. Створюється масив із п'яти файлових покажчиків. Отже, можна одночасно відкрити не більше п'яти файлів. Файловий покажчик першого файлу зберігається в елементі масиву f, другого - f і т.д.
  2. Перевіряється кількість аргументів командного рядка. Їх має не менше трьох, т.к. перший - це ім'я програми, другий - режим відкриття файлу, третій - перший або єдиний файл, який буде здійснюватися запис. Оскільки програма дозволяє відкрити лише п'ять файлів, то загальна кількість аргументів командного рядка не може бути більшою за сім. Тож якщо кількість аргументів менше 3 чи більше 7, програма завершується, т.к. оператор return призводить до виходу з функції, навіть якщо після нього ще є код. Значення, що повертається з функції нерівне 0, може бути інтерпретовано батьківським процесом, як повідомлення про те, що програма завершилася з помилкою.
  3. Перевіряється коректність другого аргументу командного рядка. Якщо він не дорівнює ні "-w", ні "-a", то умовний вираз у другому if повертає 1 (true). Функція strcmp() дозволяє порівнювати рядки та повертає 0 у разі їх рівності.
  4. В циклі forвідкриваються файли за вказаними адресами, які розпочинаються з третього елемента масиву argv. Саме тому i додається 2, щоб отримувати елементи масиву argv, починаючи з третього. Вираз argc-2 показує кількість переданих імен файлів; т.к. в argc зберігається загальна кількість аргументів командного рядка, перші з яких є іменами файлів.
  5. Вираз argv+1 дозволяє "вирізати" з рядка "-w" (або "-a") підрядок "w" (або "a"), т.к. argv насправді покажчик на перший елемент рядка. Додаючи до вказівника одиницю, ми зміщуємо його до наступного елемента масиву.
  6. Якщо файл відкрити не вдається, то функція fopen() повертає NULL. У такому разі програма завершується.
  7. Кожен символ, введений користувачем із клавіатури, записується у всі відкриті файли.
  8. Наприкінці файли закриваються.

При автоматизованому створенні консольної програми у мові програмування С++, автоматично створюється головна функція дуже схожа на цю:

int main(int argc, char * argv)
{…}

Заголовок функції містить сигнатуру головної функції main() з аргументами argс та argv .
Якщо програму запускати через командний рядок, існує можливість передати будь-яку інформацію цій програмі. Для цього існують аргументи командного рядка argc та argv .
Параметр argc має тип int і містить кількість параметрів, що передаються в функцію main . Причому argc завжди щонайменше 1, навіть коли функції main не передається жодної інформації, оскільки першим параметром вважається ім'я програми.
Параметр argv є масивом покажчиків на рядки. Через командний рядок можна передати лише дані рядкового типу.

Під час запуску програми через командну рядок Windowsможна передавати певну інформацію. При цьому командний рядок матиме вигляд:
Диск:\шлях\ім'я.exe аргумент1 аргумент2 …

Аргументи командного рядка поділяються одним або декількома пробілами.

Аргумент argv містить повне ім'я програми:

#include
using namespace std;

cout<< argv << endl;

Return 0;
}

Результат виконання

Приклад: обчислення твору двох цілих чисел
У програмі використовується функція перетворення рядка на ціле число StrToInt() звідси.

#include
using namespace std;
int StrToInt(char *s) (…)
int main(int argc, char * argv) (

Int a = 0, b = 0;

If (argc > 1)

a = StrToInt(argv);

If (argc > 2)

b = StrToInt(argv);

cout<< a <<«*» << b << «= « << a*b << endl;

Return 0;
}

Запуск програми здійснюється як

Результат виконання

Налагодження програми з аргументами командного рядка

Для передачі аргументів командного рядка при налагодженні програми необхідно звернутися до меню Властивостіпроекту.


На вкладці Властивості конфігурації ->Налагодженнявибрати Аргументи командита задати їх значення.

При запуску програми в режимі налагодження введені аргументи сприйматимуться програмою як аргументи командного рядка.


Іноді при запуску програми корисно передати їй будь-яку інформацію. Зазвичай, така інформація передається функції main() за допомогою аргументів командного рядка. Аргумент командного рядка- це інформація, яка вводиться в командному рядку операційної системи за ім'ям програми. Наприклад, щоб запустити компіляцію програми, необхідно в командному рядку після підказки набрати приблизно таке:

Cc ім'я_програми

ім'я_програмиє аргументом командного рядка, він вказує ім'я тієї програми, яку ви збираєтеся компілювати.

Щоб прийняти аргументи командного рядка, використовуються два спеціальні вбудовані аргументи: argc і argv. Параметр argc містить кількість аргументів у командному рядку і є цілим числом, причому він завжди не менший за 1, тому що першим аргументом вважається ім'я програми. А параметр argv є покажчиком масив покажчиків на рядки. У цьому масиві кожен елемент свідчить про будь-який аргумент командного рядка. Усі аргументи командного рядка є рядковими, тому перетворення будь-яких чисел у потрібний двійковий формат має бути передбачено у програмі під час її розробки.

Ось простий приклад використання аргументу командного рядка. На екрані виводяться слово Привіт та ваше ім'я, яке треба вказати як аргумент командного рядка.

#include #include int main(int argc, char *argv) ( if(argc!=2) ( printf("Ви забули ввести своє ім'я.\n"); exit(1); ) printf("Привіт %s", argv); return 0;

Якщо ви назвали цю програму name і ваше ім'я Том, то для запуску програми слід в командний рядок ввести name Том. В результаті виконання програми на екрані з'явиться Привіт, Том.

У багатьох середовищах усі аргументи командного рядка необхідно відокремлювати один від одного пробілом чи табуляцією. Коми, крапки з комою і тому подібні символи роздільниками не вважаються. Наприклад,

Run Spot, run

складається з трьох символьних рядків, тоді як

Ерік, Рік, Фред

є одним символьним рядком - коми, як правило, роздільниками не вважаються.

Якщо рядок є прогалини, те, щоб із неї не вийшло кілька аргументів, у деяких середовищах цей рядок можна укладати в подвійні лапки. В результаті весь рядок буде вважатися одним аргументом. Щоб дізнатися, як у вашій операційній системі задаються параметри командного рядка, вивчіть документацію цієї системи.

Дуже важливо правильно оголошувати argv. Ось як це роблять найчастіше:

Char *argv;

Порожні квадратні дужки вказують на те, що масив має невизначену довжину. Тепер отримати доступ до окремих аргументів можна за допомогою індексації масиву argv. Наприклад, argv вказує на перший символьний рядок, яким завжди є ім'я програми; argv вказує на перший аргумент і таке інше.

Іншим невеликим прикладом використання аргументів командного рядка є наведена далі програма countdown (рахунок у зворотному порядку). Ця програма вважає у зворотному порядку, починаючи з будь-якого значення (вказаного в командному рядку), і подає звуковий сигнал, коли доходить до 0. Зверніть увагу, що перший аргумент, що містить початкове значення, перетворюється на ціле значення за допомогою стандартної функції atoi (). Якщо другим аргументом командного рядка (і якщо вважати аргументом ім'я програми, то третім) є рядок «display» (висновок на екран), результат відліку (у зворотному порядку) буде виводитися на екран.

/* Програма рахунку у зворотному порядку. */ #include #include #include #include int main(int argc, char *argv) (int disp, count; if(argc)<2) { printf("В командной строке необходимо ввести число, с которого\n"); printf("начинается отсчет. Попробуйте снова.\n"); exit(1); } if(argc==3 && !strcmp(argv, "display")) disp = 1; else disp = 0; for(count=atoi(argv); count; --count) if(disp) printf("%d\n", count); putchar("\a"); /* здесь подается звуковой сигнал */ printf("Счет закончен"); return 0; }

Зверніть увагу, якщо аргументи командного рядка не будуть вказані, буде виведено повідомлення про помилку. У програмах з аргументами командного рядка часто робиться таке: у випадку, коли користувач запускає ці програми без уведення потрібної інформації, виводяться інструкції про те, як правильно вказувати аргументи.

Щоб отримати доступ до окремого символу одного з аргументів командного рядка, введіть argv другий індекс. Наприклад, наступна програма виводить усі аргументи, з якими її викликали:

#include int main(int argc, char *argv) ( int t, i; for(t=0; t

Пам'ятайте, перший індекс argv забезпечує доступ до рядка, а другий індекс - доступ до окремих символів.

Зазвичай argc і argv використовують у тому, щоб передати програмі початкові команди, які знадобляться їй під час запуску. Наприклад, аргументи командного рядка часто вказують такі дані як ім'я файлу, параметр або альтернативна поведінка. Використання аргументів командного рядка надає вашій програмі «професійний зовнішній вигляд» та полегшує її використання у пакетних файлах.

Імена argc та argv є традиційними, але не обов'язковими. Ці два параметри у функції main() можна назвати як завгодно. Крім того, в деяких компіляторах для main() можуть підтримуватися додаткові аргументи, тому обов'язково вивчіть документацію до вашого компілятора.

Коли для програми не потрібні параметри командного рядка, то найчастіше явно декларують функцію main() як параметри, що не мають. У такому разі у списку параметрів цієї функції використовують ключове слово void.

Borland C++ підтримує три аргументи main(). Перші два – це традиційні argc та argv. Це єдині аргументи функції main(), що визначаються стандартом ANSI С. Вони дозволяють передавати аргументи командного рядка програму. Аргументи командного рядка - це інформація, яка йде за ім'ям програми в командному рядку операційної системи. Наприклад, коли програма компілюється за допомогою рядкового компілятора Borland, набирається, як правило, bcc ім'я_ програми

Де ім'я_програми- це програма, яку потрібно відкомпілювати. Ім'я програми передається компілятор як аргумент.

Параметр argc містить число аргументів командного рядка та є цілим числом. Він завжди дорівнює принаймні 1, оскільки ім'я програми кваліфікується як перший аргумент. Параметр argv - це покажчик масив символьних покажчиків. Кожен елемент даного масиву вказує на аргумент командного рядка. Усі аргументи командного рядка – це рядки. Усі числа конвертуються програмою у внутрішній формат. Наступна програма виводить Hello, а потім ім'я користувача, якщо його набрати прямо за ім'ям програми:

#include

{
if(argc!=2)
{
printf ("You forgot to type your name\n");
return 1;
}
printf("Hello %s", argv);
return 0;
}

Якщо назвати цю програму name, а ім'я користувача Сергій, то для запуску програми слід набрати:
name Сергій.
В результаті роботи програми з'явиться:
"Hello Сергій".

Аргументи командного рядка мають відокремлюватися пробілами чи табуляціями. Коми, точки із комами і їм подібні символи не розглядаються як роздільники. Наприклад:

Складається з трьох рядків, тоді як

Herb,Rick,Fred

Це один рядок - коми не є роздільниками.

Якщо необхідно передати рядок, що містить пробіли або табуляції у вигляді одного аргументу, слід укласти його в подвійні лапки. Наприклад, це один аргумент:

"this is a test"

Важливо правильно оголосити argv. Найбільш типовим методом є:

Порожні дужки вказують на те, що масив не має фіксованої довжини. Можна отримати доступ до окремих елементів за допомогою індексації argv. Наприклад, argv вказує на перший рядок, який завжди містить ім'я програми. argv вказує на наступний рядок і таке інше.

Нижче наведено невеликий приклад щодо використання аргументів командного рядка. Він відраховує у зворотному порядку від значення, вказаного в командному рядку, і при досягненні нуля подає сигнал. Звернемо увагу, що перший аргумент містить число, перетворене на ціле число з використанням стандартної функції atoi(). Якщо другий аргумент присутній рядок "display", то на екрані буде відображатися сам лічильник.

/* програма відліку */

#include
#include
# include
int main(int argc, char *argv)
{
int disp, count;
if(argc<2)
{
printf("You must enter the length of the count\n");
printf ("on the command line. Try again.\n");
return 1;
}
if (argc==3 && !strcmp(argv,"display")) disp = 1;
else disp = 0;
for(count=atoi(argv); count; -count)
if (disp) printf("%d", count);
printf("%c", "\a"); /* на більшості комп'ютерів це дзвінок */
return 0;
}

Звернемо увагу, що якщо не вказано аргументів, з'являється повідомлення про помилку. Це найбільш типово для програм, які використовують аргументи командного рядка для видачі інструкцій, якщо спроба запустити програму без правильної інформації.

Для доступу до окремих символів командного рядка слід додати другий індекс до argv. Наприклад, наступна програма виводить усі аргументи, з якими вона викликалася, по одному символу за один раз:

#include
int main(int argc, char *argv)
{
int t, i;
for(t=0; t {
i = 0;
while(argv[t][i])
{
printf("%c", argv[t][i]);
}
printf("");
}
return 0;
}

Треба пам'ятати, перший індекс призначений для доступу до рядка, а другий - для доступу до символу рядка.

Зазвичай argc та argv використовуються для отримання вихідних команд. Теоретично можна мати до 32 767 аргументів, але більшість операційних систем не дозволяють навіть близько підійти до цього. Зазвичай ці аргументи використовуються для вказівки імені файлу або опцій. Використання аргументів командного рядка надає програмі професійного вигляду та допускає використання програми в командних файлах.

Якщо приєднати файл WILDARGS.OBJ, що постачається з Borland C++, можна буде використовувати шаблони в аргументах типу *.EXE. (Borland C++ автоматично обробляє шаблони і відповідним чином збільшує argc.) Наприклад, якщо приєднати до наступної програми WILDARGS.OBJ, вона видасть, скільки файлів відповідає імені вказаного в командному рядку файлу:

/* Скомпонуйте цю програму з WILDARGS.OBJ */

#include
int main(int argc, char *argv)
{
register int i;
printf("%d files match specified name\n", argc-1);
printf("They are:");
for(i=1; i printf ("%s", argv[i]);
return 0;
}

Якщо назвати цю програму WA, потім запустити її як зазначено нижче, отримаємо кількість файлів, що мають розширення ЕХE, та список імен цих файлів:

Крім argc та argv Borland С++ також надає третій аргумент командного рядка -env. Параметр env дозволяє програмі отримати доступ до інформації про середовище операційної системи. Параметр env повинен слідувати за argc і argv і оголошується так:

Як можна бачити, env оголошується так само, як і argv. Так само, як і argv, це вказівник на масив рядків. Кожен рядок - це рядок середовища, визначений операційною системою. Параметр env не має аналога параметра argc, який повідомляв би скільки є рядків середовища. Натомість останній рядок середовища нульовий. Наступна програма виводить усі рядки середовища, визначені на поточний момент в операційній системі:

/* дана програма виводить усі рядки оточення */

#include
int main(int argc, char *argv, char *env)
{
int t;
for(t=0; env[t]/t++)
printf("%s\n", env[t]);
return 0;
}

Звернемо увагу, що хоча argc і argv не використовуються програмою, вони повинні бути присутніми у списку параметрів. Не знає імена параметрів. Натомість їх використання визначається по порядку оголошення параметрів. Фактично можна обізвати параметр як завгодно. Оскільки argc, argv і env - це традиційні імена, то краще їх використовувати і далі, щоб будь-яка людина, яка читає програму, могла миттєво зрозуміти, що це аргументи функції main().

Для програм типовим завданням є пошук значення, визначеного у рядку середовища. Наприклад, вміст рядка PATH дозволяє програмам використовувати шляхи пошуку. Наступна програма демонструє, як знайти рядки, які оголошують стандартні шляхи пошуку. Вона використовує стандартну бібліотечну функцію strstr(), що має наступний прототип:

Char * strstr (const char * str1, const char * str2);

Функція strstr() шукає рядок, який вказує str1 у рядку, яку вказує str2. Якщо такий рядок знайдено, повертається покажчик на перше положення. Якщо не знайдено відповідності, то функція повертає NULL.

/* програма шукає серед рядків оточення рядок, що містить PATH */

#include
#include
int main (int argc, char *argv, char *env)
{
int t;
for(t=0; env[t]; t++)
{
if(strstr(env[t], "PATH"))
printf("%s\n", env[t]);
}
return 0;
}



Завантаження...
Top