Использование аргументов командной строки в С
Исполняемый файл этой программы разместим на одном из жестких дисков, например, на диске D, т. е. D:\forma.exe. Также и файл "knapsack.exe" разместим на диске D, т. е. D:\knapsack.exe. Для запуска исполняемых приложений используем функцию _spawnl(), для которой подключим заголовочный файл <process.h>. Основной программный код решения примера:
#include <stdio.h> #include <conio.h> #include <locale.h> #include <process.h> #include <ctype.h> #include <string.h> int main (int argc, char *argv[]) { int count, p, i; int j; int N[20]; // массив для индексов исполняемых приложений count = p = i = 0; // На случай, когда командная строка содержит русские шрифты setlocale(LC_ALL, "rus"); printf("\n Общее количество аргументов: %d\n\n", argc); if (argc == 1) printf(" Имя аргумента и путь к нему:\n%4d) %s\n", count+1, argv[count]); else { for (count = 0; count < argc; count++) { printf(" %3d) %s\n", count+1, argv[count]); if ( (strstr(argv[count], ".exe")) != NULL) N[i++] = count; } } if (i > 1) { if (i == 2) printf("\n Для запуска исполняемого приложения \n \ можно ввести число "); else printf("\n Для запуска исполняемого приложения \n \ можно ввести числа "); for (j = 1; j < i; j++) { if (j < i-1) printf("\"%d\", ", N[j]+1); else printf("\"%d\": ", N[j]+1); } scanf_s("%d", &p); _spawnl(_P_WAIT, argv[p-1], argv[p-1], NULL); } else printf("\n Исполняемых приложений нет.\n"); printf("\n Завершение проекта tcmd ... Press any key: "); _getch(); return 0; }
В программе используется функция strstr() для поиска заданной подстроки (.ехе) в заданной строке символов. Для этой функции подключен заголовочный файл <string.h>. В общем случае исполняемые файлы могут быть заданы без расширения .ехе. Можно также имена исполняемых файлов передавать в функцию как строки, определенные в самой программе без использования командной строки.
Пример выполнения программы показан на рис. 21.3.
Задание 1
- Внесите изменения в программу, чтобы исполняемые файлы выполнялись без указания расширения .ехе.
- В программу внесите изменения для определения номера (номеров) индексов первого символа подстроки (подстрок) ".ехе".
- В командную строку (с помощью закладки Alt+F7) введите номер компьютера, на котором выполняется лабораторная работа. Проверьте работу программы.
- Проверьте работоспособность программы, когда в качестве второго аргумента функции main() будет использоваться char **argv.
- Внесите в программу изменения для посимвольного вывода аргументов командной строки.
- В программе предусмотрите защиту от неправильного ввода данных с клавиатуры.
Пример 2. Напишите программу с аргументами командной строки, которые вводятся с помощью интерпретатора cmd. В качестве аргументов примите исполняемый файл forma.exe (см. предыдущий пример), notepad.exe, winword.exe.
Файлы notepad.exe, winword.exe расположены в директориях "C:\WINDOWS\system32" и "C:\Program Files\Microsoft Office\OFFICE12" (последний путь зависит от версии Microsoft Office). Расположим указанные исполняемые файлы на диске С:.
Программный код решения примера 2 можно оставить таким же, что и для примера 1.
Начало выполнения программы показано на рис. 21.4.
В соответствии с введенным номером аргумента командной строки открывается "Блокнот", который показан на рис. 21.5.
После закрытия блокнота (Безымянный - Блокнот) произойдет завершение программы tcmd.
Задание 2
- Проверьте работу программы при расположении указанных исполнимых приложений на разных жестких дисках.
- Проверьте работу программы по всем номерам исполняемых приложений.
- В программу внесите операцию чтения текстового файла (из блокнота, который откроется после выбора notepad.exe), в котором записать номер компьютера, за которым выполняется лабораторная работа, специальность обучения (например, АСОИУ) и номер учебной группы
- В качестве аргумента командной строки введите команду ping.exe (путь к ней: C:\WINDOWS\system32). Скриншот полученного результата вставьте в отчет лабораторной работы.
- В качестве аргумента командной строки введите команду qprocess.exe (путь к ней: C:\WINDOWS\system32). Скриншот полученного результата вставьте в отчет лабораторной работы.
Контрольные вопросы
- Какой тип имеют аргументы командной строки?
- Какое основное назначение имеют аргументы командной строки?
- Каким образом разделяются аргументы командной строки?
- К чему приводит инкрементирование второго аргумента функции main() в программе, в которой происходит обращение к этому аргументу?
- Каким образом можно вставить содержимое буфера памяти (например, полный путь к команде notepad.exe или строку из текстового документа) в командную строку операционной системы Windows?