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

Язык Си в примерах


  1. Компиляция программ
  2. Простейшая программа «Hello World»
  3. Учимся складывать
  4. Максимум
  5. Таблица умножения
  6. ASCII-коды символов
  7. Верхний регистр
  8. Скобочки
  9. Факториал
  10. Степень числа
  11. Треугольник Паскаля
  12. Корень уравнения
  13. Система счисления
  14. Сортировка
  15. Библиотека complex
  16. Сортировка на основе qsort
  17. RPN-калькулятор
  18. RPN-калькулятор на Bison
  19. Простая грамматика
  20. Задача «Расчёт сопротивления схемы»
  21. Простая реализация конечного автомата
  22. Использование аргументов командной строки
  23. Чтение и печать без использования stdio
  24. Декодирование звукозаписи в формате ADX
  25. Другие примеры
  26. XCC C

Аргументы командной строки

править

Программы могут принимать аргументы. Ниже приведен пример программы argv, которая печатает список аргументов, которые были переданы ей в командной строке. Пример ее работы:

bash$ ./argv alpha beta gamma last
Argument 0: ./argv
Argument 1: alpha
Argument 2: beta
Argument 3: gamma
Argument 4: last


 /* 
    Build me with
      gcc -o argv argv.c
 */
 #include <stdio.h>
 int main (int argc, char * argv[]) {
         int i;
         for( i = 0 ; i < argc; i++) {
                 printf("Argument %d: %s\n", i, argv[i]);
         }
         if(argc == 1) {
                 printf("Command line has no additional arguments\n");
         }
         return 0;
 }

Например стандартная программа 'ls' в Linux в качестве аргумента принимает имена директорий, содержимое которых нужно вывести в стандартный поток вывода. Команда

bash$ ls /home/user

выведет содержимое директории '/home/user'.

Команда 'ls' имеет множество опций, которые можно передавать в командной строке. О них вы можете узнать, запустив команду 'ls' с опцией '-h':

bash$ ls -h

Вообще, программа может получать данные из нескольких источников. Наиболее важные источники это:

  • аргументы командной строки;
  • стандартный поток ввода;
  • файлы;
  • средства взаимодействия процессов (signals, sockets, messages, ...).

Научимся использовать первый из них.

Подробнее об аргументах командной строки

править

Основной функцией в программе на языке Си является функция main(). Мы уже познакомились с простейшим способом объявления этой функции:

 /*
 * Простейшая форма main()
 */
 int main() {
 
     // ...
 
     return 0;
 }

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

 /*
 * main() с обработкой параметров
 */
 int main(int argc, char **argv) {
 
     // ...
 
     return 0;
 }

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

Для доступа к параметру под номером i следует писать argv[i]. Выражение argv[i] — это строка, передаваемая в соответствии с соглашениями языка Си о строках. С ней можно проделывать все операции, как с обычной строкой (её даже можно модифицировать, но это считается дурным тоном!).

Вот еще один пример программы, работающей со своей командной строкой:

Пример 2

править
 /*
 * Пример программы, работающей со своей командной строкой
 */
 #include <stdio.h>
 #include <string.h>
 int main(int argc, char **argv) {
     if(argc <= 1) {
         printf("syntax : \n\t%s --help or\n\t./p --add [a] [b]\n", argv[0]);
         return 0;
     }
     if(!strcmp(argv[1], "--help")) {
         printf("You requested help message.\n");
     } else if(!strcmp(argv[1], "--add")) {
         if(argc <= 3) {
             printf("'--add' operation requires two parameters.\n");
         } else {
             int a, b;
             if(sscanf(argv[2], "%d", &a) != 1 || sscanf(argv[3], "%d", &b) != 1) {
                 printf("'--add' operation requires two integer parameters.\n");
             } else {
                 printf("%d + %d = %d\n", a, b, a+b);
             }
         }
     } else {
         printf("Unknown parameter: '%s'. Type %s --help for help.\n", argv[1], argv[0]);
     }
     return 0;
 }

Задачи для самостоятельного решения

править
  • Напишите программу, которая интерпретирует свои аргументы как целые числа и выводит на стандартный поток вывода их сумму.
  • Напишите программу, которая принимает аргумент -- имя файла, и выводит содержимое этого файла.
  • в текстовом виде, обозначая не ASCII символы знаками вопроса (если дана опция =-text= );
  • в шестнадцатиричном виде (если дана опция =-hex=);
  • как есть (по умолчанию).

См. также

править