2010-10-09 2 views
63

Возможные Дубли:
What are the arguments to main() for?
What does int argc, char *argv[] mean?Что касается 'основного (INT ARGC, символ * ARGV [])'

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

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

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

+1

Обратите внимание, что если вы не собираетесь использовать аргументы командной строки, вполне допустимо (и очень разумно) определить функцию 'int main (void)' или 'int main()'. Тип возврата ('int') является обязательным в C99 или C11; компиляторы иногда позволяют вам опустить его, если вы не укажете, к какой версии стандарта C ваш код придерживается. См. Также [Что должно быть 'main()' return in C и C++] (http://stackoverflow.com/questions/204476/). –

ответ

88

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

Программа получает количество аргументов в argc и вектор аргументов в argv, в выше агде ument с р а ф будет два (Отсчеты названия программы в качестве первого аргумента) и Arg ument v ector будет содержать [cat, file, 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, который содержит вектор программ environment variables. Дальнейшие вариации списка аргументов функции main существуют, но я не буду здесь подробно останавливаться, поскольку он нестандартен.

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

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

И для вашего второго вопроса, то есть несколько способов отправки аргументов в программа. Я бы порекомендовал вам взглянуть на exec*()family of functions которая POSIX Нестандартный, но это, вероятно, проще просто использовать system("command arg1 arg2"), но использование system() обычно неодобрением, как это не гарантировано работать на любой системе. Я сам не проверял; но если нет bash, zsh или другой оболочки, установленной в * NIX-системе, system() не удастся.

+0

Если я не ошибаюсь, то минимальное значение 'argc' равно 1, а' argv [0] 'содержит строку'./Mymainprogram', тогда как 'argv [1]' is 'NULL'. Мои вопросы - ** 1: ** Какое максимальное значение имеет значение argc? ** 2: ** Какие эти строки добавлены в 'argv []'? – barnes

+1

@barnes - Максимум зависит от ОС. В Win32 сама командная строка имеет ограничение длины 32K, поэтому 'argc' имеет практический предел в 16K. –

+1

Поздравляем вас с вашей вехой в истории 1k сегодня! – wizzwizz4

0

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

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

13

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

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

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

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


Ресурсы:

+0

Какое имя программы связано с аргументами, переданными в main()? –

+1

@Potatoswatter, @You, я обновил свой ответ, чтобы прямо сказать, что envp не является стандартным. @fahad, обычно первым аргументом является имя приложения, таким образом вы можете узнать, как было вызвано ваше приложение. –

+0

Как известно, как его зовут? –

3

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

+0

'int main()' действителен только на C++. В C вам нужно поместить пустоту следующим образом: 'int main (void)'. C-style 'int main (void)' также действителен в C++, хотя его использование в C++ не рекомендуется. – Ultimater

+0

@Ultimater Я уверен, что 'int main()' также действителен в C. Он объявляет функцию varargs. – Navin

+0

@Navin Многие компиляторы C++ очень простятся, когда сталкиваются с C-кодом, поскольку C++ позволяет компилировать как 'int main()', так и 'int main (void)', но компилятор C, определенно старый компилятор C, не поддерживает стиль C++ 'int main()'. Я взял курс на C/C++, который уделял большое внимание переносимости, и если ваше назначение должно было быть написано на C, и вы дали ему объявление 'int main()', его контролер назначений будет жаловаться, даже не компилируя его , и мы потеряли бы очки в задании, если мы не представим его к крайнему сроку. – Ultimater

39

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

$ 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 

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

0

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

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

Это единственные два прототипа, определенные для main в соответствии со стандартами, но некоторые компиляторы позволяют возвращать тип void. Подробнее об этом on Wikipedia.

+1

int main() {} is ok – Nikko

+0

С технической точки зрения, 'int main()' - функция, принимающая произвольно много аргументов, а 'int main (void)' принимает ровно нулевые аргументы, поэтому последнее является более правильным. – You

+2

no, in a * definition *, 'int main()' - функция, не имеющая параметров. В * объявлении *, которое не является определением, это функция, принимающая неуказанные параметры. Это 6.7.5.3/14 в n1256, или 6.5.5.3/10 в n794.Вопроситель спрашивает об определении. –

0

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

1

comp.lang.c FAQ имеет дело с

"What's the correct declaration of main()?"
в Question 11.12a.

+2

... но это не comp.lang.c, это StackOverflow, сообщество, в котором мы * помогаем * людям * отвечать на свои вопросы, а не перенаправлять их на руководства, часто задаваемые вопросы или ссылки lmgtfy. –

+1

Вопрос уже ответили выше. Часто задаваемые вопросы C, однако, стоит прочитать, imho. Но в своей лицензии он заявляет, что он не может быть воспроизведен без разрешения. Поэтому ссылки. Просто ради полноты. – cschol

Смежные вопросы