Относительно 'main (int argc, char * argv [])'

Возможные дубликаты:
Каковы аргументы main () для?
Что означает int argc, char * argv [] означает?

Каждая программа начинается с определения main(int argc, char *argv[]).

Я не понимаю, что это значит. Я был бы очень рад, если бы кто-нибудь мог объяснить, почему мы используем эти аргументы, если не используем их в программе? Почему не просто: int main()?

Является ли имя программы одним из элементов *argv[], а argc - это количество аргументов в *argv[]? Какие еще аргументы отправлены на *argv[]? Как мы их отправим?


person Community    schedule 09.10.2010    source источник
comment
Обратите внимание: если вы не собираетесь использовать аргументы командной строки, вполне допустимо (и очень разумно) определить функцию int main(void) или int main(). Тип возврата (int) является обязательным в C99 или C11; компиляторы иногда позволяют вам опустить его, если вы не укажете, какой версии стандарта C придерживается ваш код. См. Также Что main() должно возвращать в C и C ++.   -  person Jonathan Leffler    schedule 05.02.2016


Ответы (8)


Аргументы argc и argv из main используются как способ отправки аргументов программе, возможно, наиболее знакомый способ - использовать старый добрый терминал, где пользователь может ввести cat file. Здесь слово cat - это программа, которая принимает файл и выводит его на стандартный вывод (stdout).

Программа получает количество аргументов в argc и вектор аргументов в argv, в приведенном выше arg ument c ount будет два (имя программы считается первым аргумент), а эктор arg ument v будет содержать [_9 _, _ 10_, null]. Пока последний элемент является нулевым указателем.

Обычно вы пишете это так:

int  // Specifies that type of variable the function returns.
     // main() must return an integer
main ( int argc, char **argv ) {
     // code
     return 0; // Indicates that everything went well.
}

Если ваша программа не требует никаких аргументов, также можно написать main-функцию следующим образом:

int main() {
  // code
  return 0; // Zero indicates success, while any 
  // Non-Zero value indicates a failure/error
}

В ранних версиях языка C не было int до main, как это подразумевалось. Сегодня это считается ошибкой.

В системах, совместимых с POSIX (и Windows), существует возможность использовать третий параметр char **envp, который содержит вектор программ env железные переменные. Существуют и другие варианты списка аргументов функции main, но я не буду подробно описывать их здесь, поскольку они нестандартны.

Кроме того, именование переменных является соглашением и не имеет реального значения. Всегда полезно придерживаться этого правила, чтобы не сбивать с толку других, но было бы также правильно определить main как

int main(int c, char **v, char **e) {
   // code
   return 0;
}

И что касается вашего второго вопроса, есть несколько способов отправить аргументы программе. Я бы порекомендовал вам взглянуть на exec*()семейство функций, которое является POSIX -standard, но, вероятно, проще просто использовать _21 _ ("command arg1 arg2"), но использование system() обычно не одобряется, поскольку не гарантируется его работа в каждой системе. Сам не тестировал; но если в системе * NIX не установлена ​​_24 _, _ 25_ или другая оболочка, system() завершится ошибкой.

person Frank    schedule 09.10.2010
comment
Если я не ошибаюсь, то минимально возможное значение argc равно 1, а argv[0] содержит строку ./mymainprogram, тогда как argv[1] это NULL. Мои вопросы: 1: Какое максимальное значение может содержать argc? 2: Какие строки добавляются к argv[]? - person phougatv; 22.01.2015
comment
@barnes - максимум зависит от ОС. В Win32 сама командная строка имеет ограничение на длину 32 КБ, поэтому argc имеет практическое ограничение в 16 КБ. - person Jesse Chisholm; 10.02.2016
comment
@barnes: Старый DOS ограничен 127 байтами для аргументов командной строки, не то чтобы это уже имело большое значение, а просто забавный факт, который я припоминаю ^ _ ^ - person Frank; 24.02.2018
comment
@JesseChisholm Я понимаю, что это уже довольно давно, но стоит сказать, что это ограничение не применяется к процессам Cygwin, которые запускают другие процессы Cygwin (в таких случаях они передают argv напрямую). Кроме того, я работал над способом обойти ограничение Windows. - person alastair; 12.01.2020
comment
@alastair Согласен, программный запуск процесса практически не имеет ограничений, тогда как ввод команды в оболочке ограничен. Фрэнк ссылается на командную оболочку DOS, ограничивающую ее до 127 байтов, а не на принимающую программу. Точно так же эффективные 16K в оболочке CMD Win32. - person Jesse Chisholm; 19.01.2020
comment
@JesseChisholm К сожалению, ограничение в 32 КБ фактически встроено в саму Windows. Оболочка CMD еще более ограничена (общая длина командной строки 8 КБ). - person alastair; 20.01.2020
comment
char **envp в качестве третьего аргумента не является частью стандарта POSIX. См. Эту ветку - person ben; 17.03.2021

Это для передачи аргументов вашей программе, например, из командной строки, когда программа вызывается.

$ gcc mysort.c -o mysort

$ mysort 2 8 9 1 4 5

Выше программа mysort выполняется с некоторыми параметрами командной строки. Внутри main( int argc, char * argv[]) это приведет к

Argument Count, argc = 7 

поскольку есть 7 аргументов (считая программу), и

Argument Vector, argv[] = { "mysort", "2", "8", "9", "1", "4", "5" };

Ниже приводится полный пример.

$ cat mysort.c
#include <stdio.h>
int main( int argc, char * argv [] ) {
    printf( "argc = %d\n", argc );
    for( int i = 0; i < argc; ++i ) {
        printf( "argv[ %d ] = %s\n", i, argv[ i ] );
    }
}

$ gcc mysort.c -o mysort

$ ./mysort 2 8 9 1 4 5
argc = 7
argv[ 0 ] = ./mysort
argv[ 1 ] = 2
argv[ 2 ] = 8
argv[ 3 ] = 9
argv[ 4 ] = 1
argv[ 5 ] = 4
argv[ 6 ] = 5

[char строки «2», «8» и т. Д. Могут быть преобразованы в число с помощью некоторой функции преобразования символа в число, например atol() (ссылка)]

person Arun    schedule 09.10.2010

С помощью argc (количество аргументов) и argv (вектор аргументов) вы можете получить количество и значения переданных аргументов при запуске вашего приложения.

Таким образом, вы можете использовать параметры (такие как -version), когда ваше приложение запускается, чтобы действовать по-другому.

Но вы также можете использовать int main(void) в качестве прототипа в C.

Существует третий (менее известный и нестандартный) прототип с третьим аргументом envp. Он содержит переменные среды.


Ресурсы:

person Colin Hebert    schedule 09.10.2010
comment
Какое отношение имеет имя программы к аргументам, передаваемым в main ()? - person ; 10.10.2010
comment
@Potatoswatter, @You, я обновил свой ответ, чтобы прямо сказать, что envp не является стандартным. @fahad, обычно первым аргументом является имя приложения, таким образом вы можете узнать, как ваше приложение было вызвано. - person Colin Hebert; 10.10.2010
comment
Просто по названию, как бы вы узнали, как он назывался? - person ; 10.10.2010
comment
@fahad, я имел в виду, как было названо приложение. Это может, например, использоваться для вывода сообщения об ошибке, такого как Illegal option ... usage: applicationName [-v] - person Colin Hebert; 10.10.2010
comment
В ОС * nix не исключено, что разные программы являются символическими ссылками на один и тот же исполняемый файл - знание того, как он был вызван, позволяет этому исполняемому файлу вести себя по-разному в зависимости от того, как он был вызван. классическим примером этого, я думаю, является утилита busybox - один и тот же файл ведет себя как буквально сотни других утилит (возможно, в урезанном виде или реализуя только наиболее часто используемые функции каждой из них) как всего один исполняемый файл, что является преимуществом во многих сценариях ... - person SlySven; 11.09.2016

argc означает количество аргументов, переданных программе. char* argv[] - переданные аргументы. argv[0] - это всегда само имя программы. Я не уверен на 100%, но думаю, что int main() подходит для C / C ++.

person kraftan    schedule 09.10.2010
comment
int main() допустимо только в C ++. В C вам нужно поместить пустоту примерно так: int main(void). Стиль C int main(void) также допустим в C ++, хотя его использование в C ++ не рекомендуется. - person Ultimater; 07.03.2016
comment
@Ultimater Я почти уверен, что int main() также действителен в C. Он объявляет функцию varargs. - person Navin; 04.07.2016
comment
@Navin Многие компиляторы C ++ очень снисходительны, когда сталкиваются с кодом C, поскольку C ++ позволяет компилировать как int main(), так и int main(void), но компилятор C, определенно более старый компилятор C, не поддерживает стиль C ++ int main(). Я прошел курс по C / C ++, в котором упор делался на переносимость, и если ваше задание должно было быть написано на C, и вы дали ему объявление int main(), его средство проверки назначений пожаловалось бы, даже не компилируя его, и мы бы теряйте баллы за задание, если мы не отправим его повторно в установленный срок. - person Ultimater; 04.07.2016

argc - это количество аргументов командной строки, передаваемых программе во время выполнения, а argv - это массив массивов символов (скорее, массив C-строк), содержащих эти аргументы. Если вы знаете, что аргументы командной строки вам не понадобятся, вы можете вместо этого объявить свой main, приняв аргумент void:

int main(void) {
    /* ... */ 
}

Это единственные два прототипа, определенных для main в соответствии со стандартами, но некоторые компиляторы также допускают тип возвращаемого значения void. Подробнее об этом в Википедии.

person You    schedule 09.10.2010
comment
Технически int main() - это функция, принимающая произвольно много аргументов, в то время как int main(void) принимает ровно ноль аргументов, поэтому последнее более правильно. - person You; 10.10.2010
comment
нет, в определении int main() - это функция, не имеющая параметров. В объявлении, которое не является определением, это функция, принимающая неопределенные параметры. Это 6.7.5.3/14 в n1256 или 6.5.5.3/10 в n794. Спрашивающий спрашивает об определении. - person Steve Jessop; 10.10.2010

argc - количество аргументов командной строки, а argv - массив строк, представляющих аргументы командной строки.

Это дает вам возможность реагировать на аргументы, переданные программе. Если вы ничего не ожидаете, вы можете использовать int main.

person Aliostad    schedule 09.10.2010

Вы можете запустить свое приложение с такими параметрами, как app -something -somethingelse. int argc представляет количество этих параметров, а char *argv[] - массив с фактическими параметрами, передаваемыми в ваше приложение. Таким образом, вы можете работать с ними внутри вашего приложения.

person Ondrej Slinták    schedule 09.10.2010

person    schedule
comment
... но это не comp.lang.c, это StackOverflow, сообщество, в котором мы помогаем людям, отвечая на их вопросы, а не перенаправляя их на руководства, часто задаваемые вопросы и т. д. или lmgtfy ссылки. - person Mark Elliot; 10.10.2010
comment
На вопрос уже был дан ответ выше. Тем не менее, FAQ по C все же стоит прочитать, imho. Но в лицензии указано, что это не может быть воспроизведено без разрешения. Поэтому ссылки. Просто для полноты картины. - person cschol; 10.10.2010