Опубликован: 14.12.2010 | Уровень: для всех | Доступ: свободно
Лекция 22:

Использование аргументов командной строки в С

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

Пример вызова исполняемого файла

Рис. 21.3. Пример вызова исполняемого файла

Задание 1

  1. Внесите изменения в программу, чтобы исполняемые файлы выполнялись без указания расширения .ехе.
  2. В программу внесите изменения для определения номера (номеров) индексов первого символа подстроки (подстрок) ".ехе".
  3. В командную строку (с помощью закладки Alt+F7) введите номер компьютера, на котором выполняется лабораторная работа. Проверьте работу программы.
  4. Проверьте работоспособность программы, когда в качестве второго аргумента функции main() будет использоваться char **argv.
  5. Внесите в программу изменения для посимвольного вывода аргументов командной строки.
  6. В программе предусмотрите защиту от неправильного ввода данных с клавиатуры.

Пример 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.4. Пример ввода аргументов командной строки операционной системы

В соответствии с введенным номером аргумента командной строки открывается "Блокнот", который показан на рис. 21.5.

Форма текстового документа, вызванная из программы

Рис. 21.5. Форма текстового документа, вызванная из программы

После закрытия блокнота (Безымянный - Блокнот) произойдет завершение программы tcmd.

Задание 2

  1. Проверьте работу программы при расположении указанных исполнимых приложений на разных жестких дисках.
  2. Проверьте работу программы по всем номерам исполняемых приложений.
  3. В программу внесите операцию чтения текстового файла (из блокнота, который откроется после выбора notepad.exe), в котором записать номер компьютера, за которым выполняется лабораторная работа, специальность обучения (например, АСОИУ) и номер учебной группы
  4. В качестве аргумента командной строки введите команду ping.exe (путь к ней: C:\WINDOWS\system32). Скриншот полученного результата вставьте в отчет лабораторной работы.
  5. В качестве аргумента командной строки введите команду qprocess.exe (путь к ней: C:\WINDOWS\system32). Скриншот полученного результата вставьте в отчет лабораторной работы.

Контрольные вопросы

  1. Какой тип имеют аргументы командной строки?
  2. Какое основное назначение имеют аргументы командной строки?
  3. Каким образом разделяются аргументы командной строки?
  4. К чему приводит инкрементирование второго аргумента функции main() в программе, в которой происходит обращение к этому аргументу?
  5. Каким образом можно вставить содержимое буфера памяти (например, полный путь к команде notepad.exe или строку из текстового документа) в командную строку операционной системы Windows?

Мухаммадюсуф Курбонов
Мухаммадюсуф Курбонов