Язык Си в примерах/Использование аргументов командной строки: различия между версиями
Поставил теги <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> параметров), параметр под номером ноль является служебным — он содержит полный путь и имя исполняемого файла вашей программы. |
При такой записи, при вызове вашей программы, параметр <tt>argc</tt> будет содержать количество параметров командной строки '''плюс один'''. Действительные параметры нумеруются с единицы по <tt>argc-1</tt> включительно (т.е. всего <tt>argc-1</tt> параметров), параметр под номером ноль является служебным — он содержит полный путь и имя исполняемого файла вашей программы. |
||
Строка 86: | Строка 90: | ||
=== Пример 2 === |
=== Пример 2 === |
||
<source lang="c"> |
|||
/* |
/* |
||
* Пример программы, работающей со своей командной строкой |
* Пример программы, работающей со своей командной строкой |
||
Строка 113: | Строка 118: | ||
return 0; |
return 0; |
||
} |
} |
||
</source> |
|||
== Задачи для самостоятельного решения == |
== Задачи для самостоятельного решения == |
Версия от 16:29, 5 июня 2007
- Компиляция программ
- Простейшая программа «Hello World»
- Учимся складывать
- Максимум
- Таблица умножения
- ASCII-коды символов
- Верхний регистр
- Скобочки
- Факториал
- Степень числа
- Треугольник Паскаля
- Корень уравнения
- Система счисления
- Сортировка
- Библиотека complex
- Сортировка на основе qsort
- RPN-калькулятор
- RPN-калькулятор на Bison
- Простая грамматика
- Задача «Расчёт сопротивления схемы»
- Простая реализация конечного автомата
- Использование аргументов командной строки
- Чтение и печать без использования stdio
- Декодирование звукозаписи в формате ADX
- Другие примеры
Аргументы командной строки
Программы могут принимать аргументы. Ниже приведен пример программы 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=);
- как есть (по умолчанию).