"int main(int argc, char *argv[]){}" - как это работает?

Рейтинг: 1Ответов: 2Опубликовано: 09.05.2011

Зачем это нужно? Что это?

Я учусь по книге "Крупник А. самоучитель С++. Питер2005" там в теме "Массив указателей" есть такая программа:

#include < iostream>
#include < windows.h>
#include < fstream>
using namespace std;
int main(int argc, char *argv[])
{
    char s[255];
    if (argc < 2) {
        CharToOem("arhc_gv.exe <файл>", s);
        cout << s << endl;
        return 1;
    }
    ifstream infile(argv[1]);
    if (infile.fail()) {
        CharToOem("ошибка при открытии файла", s);
        cout << s << endl;
        return 3;
    }
    infile.close();
}

Вот вопрос, что делает эта программа по-сути, и зачем эти переменные argc и argv?

Ответы

▲ 6

В Вашей программе предполагается что первым аргументом передается имя файла, который надо открыть или если это не получилось напечатать сообщение об ошибке.

argc, argv[] - Так ОС передает в программу параметры вызова.

Например выполнили команду gcc -o myprog t.c В t.c программа с main(int ac, char *av[]) на языке C.

#include <stdio.h>
#include <stdlib.h>

main (int ac, char *av[])
{
  int i;
  for (i = 0; i < ac; i++)
     printf ("arg[%d] = '%s'\n",i,av[i]);
  exit(0);
}

Компилятор создаст загрузочный модуль (исполнимый файл ... ну, или как его называют в учебниках ???) с именем myprog (в Windows myprog.exe) в текущем оглавлении.

Выполним его введя с клавиатуры команду ./myprog a1 a2 a3 (в Windows myprog a1 a2 a3) Программа напечатает:

arg[0] = 'myprog'
arg[1] = 'a1'
arg[2] = 'a2'
arg[3] = 'a3'

Т.е. она печатает свое имя (av[0]) и заданные в строке вызова аргументы. ОС передает программе количество аргументов (ac) и сами аргументы (av) как вектор адресов строк (массив указателей на последовательности символов, завершающиеся двоичным нулем). Первый аргумент имя команды (путь к ней. Повызывайте из разных оглавлений и посмотрите не печать).

Кстати, вектор адресов параметров завершается нулевым адресом, т.е. av[ac] == NULL.

▲ 2

argv - это массив строк-параметров, переданных при запуске программы (параметры пишутся после адреса в командной строке, указываются в настройках ярлыка, либо в настройках отладчика через пробел). argc - это количество, переданных параметров. Нулевой параметр (argv[0]) - адрес запускаемого exe-файла.

Ничего особо толкового программа не делает. Сначала проверяет, переданы ли при запуске программы параметры. Если argc < 2, значит argv содержит только один элемент (адрес запускаемого exe-файла) и никаких параметров не передано. Выводится строка "arhc_gv.exe <файл>, возвращается 1. Если мы на этом этапе выполнение не закончили - открывается поток для записи в файл (адрес файла берется из первого переданного параметра argv[1]). Если произошла ошибка при открытии потока, выводится строка "ошибка при открытии файла", возвращается 3. Если мы дошли до конца программы, закрываем поток.