Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗФ_ОАиП / Лекции ГГУ Скорины - Программирование.doc
Скачиваний:
179
Добавлен:
21.03.2016
Размер:
2.27 Mб
Скачать

25. Передача параметров в функцию main()

Любая программа на языке С начинается с вызова функции main(). Эта функция должна быть в каждой программе.

Как и любая другая функция, функция main() может иметь параметры. Иногда при запуске программы бывает полезно передать ей какую-либо информацию. Такая информация передается функции main() с помощью аргументов командной строки. Аргументы командной строки – это информация, которая вводится в командной строке вслед за именем программы при запуске программы на выполнение не из среды разработки программы. Например, чтобы запустить архивацию файла task.cpp, необходимо в командной строке набрать следующее:

winrar a archTask task.cpp // winrar.exe a archTask task.cpp

где winrar – имя программы-архиватора, а строки «a», «archTask» и «task.cpp» представляет собой аргументы командной строки, которые говорят программе, что надо создать архив («a») с именем archTask из одного файла task.cpp.

При передаче параметров в функцию main() ее надо определять так:

int main(int argc, char *argv[]) { } // или void main(...){}

Параметр argc содержит количество аргументов в командной строке и является целым числом, причем он всегда не меньше 1, потому что первым аргументом всегда передается имя программы (имя программы с полным путем к программе ).

Параметр argv является указателем на массив указателей на строки. В этом массиве каждый элемент указывает на очередной аргумент командной строки. Пустые квадратные скобки указывают на то, что у массива неопределенная длина. Получить доступ к отдельным аргументам можно с помощью индексации массива argv. Например, argv[0] указывает на первую символьную строку, которой всегда является имя программы; argv[1] указывает на первый аргумент и так далее. Список аргументов ограничен NULL, т.е. argv[argc] == NULL.

Чтобы получить доступ к отдельному символу одного из аргументов командной строки, надо использовать в argv второй индекс. Т.е., первый индекс argv обеспечивает доступ к строке, а второй индекс – доступ к ее отдельным символам.

Все аргументы командной строки являются строковыми, поэтому преобразование числовых параметров в нужный формат должно быть предусмотрено в программе при ее разработке.

Пример программы с разными способами перевода чисел в символьном формате в целые и вещественные числа:

#include <stdio.h>

#include <stdlib.h>

// при запуске задаем, например, такие аргументы: 100 2.7

void main(int a, char *b[]) {

int k;

double f;

char *ptr;

k = atoi(b[1]);

f = atof(b[2]);

k = strtol(b[1], &ptr, 10); // ptr = адрес места ошибки в строке

f = strtod(b[2], &ptr);

sscanf(b[1], "%d", &k);

sscanf(b[2], "%lf", &f);

}

Имена argc и argv являются традиционными, но не обязательными. Эти два параметра в функции main() можно называть как угодно.

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

int main(int argc, char *argv[]) {

int k;

if (argc != 4) {

printf("Неверные параметры запуска программы!\n");

return 1;

}

k = atoi(argv[3]); // преобразование параметра-числа

printf("Привет, %s из группы %s %d-го курса",

argv[1], argv[2], k);

return 0;

}

Если имя программы – task, а ваше имя «Вася», группа «ПМ-11» с первого курса, то для запуска программы следует в командную строку ввести:

task Вася ПМ-11 1

В результате выполнения программы на экране появится сообщение: «Привет, Вася из группы ПМ-11 1-го курса».

Обратите внимание: если не все аргументы командной строки будут заданы, то будет выведено сообщение об ошибке. В программах с аргументами командной строки часто делается следующее: в случае, когда пользователь запускает эти программы без ввода нужной информации, выводятся инструкции о том, как правильно указывать аргументы.

Аргументы командной строки необходимо отделять друг от друга пробелом. Если в самом аргумента есть пробелы, то, чтобы из него не получилось несколько аргументов, этот аргумент надо заключать в двойные кавычки. В результате вся строка в кавычках будет считаться одним аргументом. Например, программу можно запустить так: task “Вася и Петя” ПМ-21 2. В результате выполнения программы на экране появится сообщение: «Привет, Вася и Петя из группы ПМ-21 2-го курса».

Что такое char *argv[]? Это массив, элементами которого служат указатели, то есть массив указателей. Значит при передаче параметров в main() ее можно определять и так:

void main(int argc, char **argv) {

...

}

Задача. Вывести на экран все аргументы командной строки (имя программы выводить не надо).

#include <stdio.h>

void main(int argc, char *argv[]){

int i;

for (i = 1; i < argc; i++)

printf("%s\n", argv[i]);

}

===== второй вариант ================

#include <stdio.h>

void main(int argc, char **argv){

char *p;

argv++;

while((p=*argv) != NULL) {

printf("%s\n", p);

argv++;

}

}

Обычно аргументы командной строки используют для того, чтобы передать программе начальные данные, которые понадобятся ей при запуске (например, через аргументы командной строки часто передаются такие данные, как имя файла или параметры запуска программы).

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

Как отлаживать в BC программы, требующие аргументы командной строки. В меню Run→Arguments... необходимо ввести аргументы командной строки. Имя программы указывать не надо. Дальше можно просто запускать и отлаживать программу в среде разработки как обычно.