Использование аргументов командной строки в С
Исполняемый файл этой программы разместим на одном из жестких дисков, например, на диске 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?


