Ответ в теме: Функция main. Аргументы и возвращаемое значение

      Комментарии к записи Ответ в теме: Функция main. Аргументы и возвращаемое значение отключены
#2986

Аргументы функции main используются для передачи данных в приложение через командную строку или от других приложений. Эту технологию используют все системные утилиты в любой операционной системе, а также, например, инструменты программиста (компилятор, отладчик, компоновщик и т.п.). Чтобы скомпилировать файл main.cpp – вы можете написать:
g++ main.cpp -o main
При этом запустится программа g++Windows g++.exe) и ей на вход будет передано три аргумента – "main.cpp", "-o", "main". Программа анализирует не только сами аргументы, но и их порядок.

Итак, у функции main() может быть два аргумента – первый отвечает за количество полученных параметров (обычно называют argc), а второй представляет собой массив параметров (argv). Вне значения, переданные в программу, внутри рассматриваются как символьные строки – тип argvchar*[argc+1].

Даже если не передавать программе никаких значений – argc будет равен единице, т.к. argv[0] всегда содержит имя запущенной программы. Последний элемент массива параметров (argv[argc]) всегда равен нулю – это может использоваться при переборе параметров.

Часто делают так, что при запуске программы без аргументов она начинает диалог с пользователем, но если аргументы переданы – то использует их (не задает лишних вопросов):

#include <fstream>
#include <iostream>
#include <string>
using namespace std;

int main(int argc, char* argv[]) {
  string in_filename;
  ifstream ifst;
  
  if (argc < 2) {
    cout << "input file name: ";
    cin >> in_filename;
  } 
  else {
    in_filename = argv[1];
  }
  
  ifst.open(in_filename);
  int data;
  
  ifst >> data;
  cout << data;
}

Приведенная программа выводит на экран первое число из файла. При этом если имя файла передается в качестве аргумента, но если аргумент не задан – программа спросит требуемое имя у пользователя во время работы:

main_arguments_example

На снимке экрана используется стандартная в UNIX команда cat, выводящая на экран содержимое файла.

Многие утилиты требуют определенное количество входных аргументов, например если приложение на вход всегда должно принимать входной и выходной файл – программа может для начала проверить количество параметров:

int main(int argc, char* argv[]) {
  enum ERRORS {
    NO_ERROR,
    BAD_ARGUMENTS_NUMBER
  };
  
  if (argc < 2) 
    return BAD_ARGUMENTS_NUMBER;
  // ...

Программа может перебирать аргументы как элементы массива, однако зачастую пользователь передает в качестве значений числа – преобразовать строку в число можно, например, с помощью sscanf или std::stringstream.

В последнем примере функция main() возвращает значение. Значением всегда является целое число, которое обрабатывается операционной системой – процесс, завершающийся с кодом ноль отработал без ошибок, во всех остальных случаях операционная система знает что произошла какая-то ошибка (при этом значения могут быть любыми, на них нет никакого стандарта). Нулевое значение функция main() вернет автоматически (при нормальном завершении программы) – это зафиксировано стандартом языка, все остальные значения рекомендуется именовать при помощи констант или перечислений (enum).