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

Материал из Викиучебника — открытых книг для открытого мира
Содержимое удалено Содержимое добавлено
Поставил теги <source>
Строка 15: Строка 15:


=== Пример 1 ===
=== Пример 1 ===
<source lang="c">

/*
/*
Build me with
Build me with
Строка 31: Строка 31:
return 0;
return 0;
}
}
</source>



Например стандартная программа 'ls' в Linux в качестве аргумента
Например стандартная программа 'ls' в Linux в качестве аргумента
Строка 57: Строка 57:
Основной функцией в программе на языке Си является функция <tt>main()</tt>. Мы уже познакомились с простейшим способом объявления этой функции:
Основной функцией в программе на языке Си является функция <tt>main()</tt>. Мы уже познакомились с простейшим способом объявления этой функции:


<source lang="c">
/*
/*
* Простейшая форма main()
* Простейшая форма main()
Строка 66: Строка 67:
return 0;
return 0;
}
}
</source>


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


<source lang="c">
/*
/*
* main() с обработкой параметров
* main() с обработкой параметров
Строка 78: Строка 81:
return 0;
return 0;
}
}
</source>


При такой записи, при вызове вашей программы, параметр <tt>argc</tt> будет содержать количество параметров командной строки '''плюс один'''. Действительные параметры нумеруются с единицы по <tt>argc-1</tt> включительно (т.е. всего <tt>argc-1</tt> параметров), параметр под номером ноль является служебным &mdash; он содержит полный путь и имя исполняемого файла вашей программы.
При такой записи, при вызове вашей программы, параметр <tt>argc</tt> будет содержать количество параметров командной строки '''плюс один'''. Действительные параметры нумеруются с единицы по <tt>argc-1</tt> включительно (т.е. всего <tt>argc-1</tt> параметров), параметр под номером ноль является служебным &mdash; он содержит полный путь и имя исполняемого файла вашей программы.
Строка 86: Строка 90:


=== Пример 2 ===
=== Пример 2 ===
<source lang="c">
/*
/*
* Пример программы, работающей со своей командной строкой
* Пример программы, работающей со своей командной строкой
Строка 113: Строка 118:
return 0;
return 0;
}
}
</source>


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

Версия от 16:29, 5 июня 2007

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


  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. Другие примеры

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

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

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


Пример 1

 /* 
    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./p --help or\n\t./p --add [a] [b]\n");
     }
     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 ./p --help for help.\n", argv[1]);
     }
     return 0;
 }

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

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

См. также