Параметры командной строки

Обычно программа получает данные через cin или файл. Но часть настроек можно передать сразу при запуске. Например, имя режима или число шагов.
Параметры командной строки приходят в main через argc и argv. argc хранит количество частей запуска. argv хранит сами части как текст.
Обычный main и main с параметрами
Раньше мы писали:
int main() {
return 0;
}
Для параметров запуска пишут так:
int main(int argc, char* argv[]) {
return 0;
}
argc — количество аргументов. argv — массив текстовых аргументов.
Вывести количество аргументов
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) {
cout << argc << endl;
return 0;
}
Запуск:
./main test fast
Обычно программа выведет 3: имя программы, test, fast.
Вывести аргументы
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) {
int i = 0;
for (i = 0; i < argc; i++) {
cout << argv[i] << endl;
}
return 0;
}
Пример запуска:
./main test fast
Возможный вывод:
./main
test
fast
argv[0] обычно содержит имя запускаемой программы. Не используйте его для важной логики.

Проверка количества
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) {
if (argc < 2) {
cout << "mode missing" << endl;
return 1;
}
cout << "mode = " << argv[1] << endl;
return 0;
}
Перед чтением argv[1] нужно проверить, что такой элемент существует.
Простое чтение числа
Аргументы командной строки приходят как текст. Чтобы получить число, можно разобрать строку вручную. Это учебный вариант без дополнительных библиотек.
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) {
int i = 0;
int n = 0;
if (argc < 2) {
cout << "number missing" << endl;
return 1;
}
while (argv[1][i] != '\0') {
if (argv[1][i] < '0' || argv[1][i] > '9') {
cout << "bad number" << endl;
return 1;
}
n = n * 10 + (argv[1][i] - '0');
i = i + 1;
}
cout << n << endl;
return 0;
}
Здесь используется то, что символы цифр идут подряд: '0', '1', ..., '9'.
Когда использовать параметры запуска
| Задача | Подходит ли |
|---|---|
| выбрать режим теста | да |
| передать имя файла | да |
| вводить много измерений | лучше файл |
| вести диалог с пользователем | лучше cin |
| менять настройки во время работы | лучше cin или меню |
Практика
- Напишите программу, которая выводит
argc. - Выведите все элементы
argvчерез цикл. - Проверьте, что
argv[1]существует перед использованием. - Передайте режим
testи выведите его. - Передайте число и разберите его учебным способом.
Проверьте себя
- Что хранит
argc? - Что хранит
argv? - Почему
argv[1]нельзя читать без проверки? - Почему аргумент запуска сначала является текстом?
- Когда параметры командной строки удобнее
cin?
Сначала ответьте без подсказки. Ответ можно считать полным, если вы:
- формулируете основную мысль своими словами;
- называете важные условия, ограничения или меры безопасности;
- для схемы, кода или расчёта показываете ход решения и ожидаемый результат.
Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.
Словарь статьи
| Термин | Значение |
|---|---|
| параметр командной строки | часть команды запуска после имени программы |
argc | количество аргументов запуска |
argv | массив текстовых аргументов |
argv[0] | обычно имя программы |
| символ конца строки | \0, признак конца C-строки |
Связанные темы
- Ввод и вывод — обычный ввод через
cin. - Массивы — индексы
argv. - Циклы — перебор аргументов.
- Чтение и запись файлов — альтернативный способ передать много данных.
Источники
- C++ Working Draft. Function
main: https://eel.is/c++draft/basic.start.main - Microsoft Learn.
mainfunction and command-line arguments: https://learn.microsoft.com/en-us/cpp/cpp/main-function-command-line-args