Args c что это
Аргументы командной строки являются распространенным способом параметризации выполнения программ. Например, go run hello.go использует аргументы run и hello.go для программы go .
package main
import ( "fmt" "os" )
func main()
os.Args предоставляет доступ к необработанным аргументам командной строки. Обратите внимание, что первое значение в этом срезе — это путь к программе, а os.Args [1:] содержит аргументы программы.
argsWithProg := os.Args argsWithoutProg := os.Args[1:]
Вы можете получить отдельные аргументы с обычной индексацией.
arg := os.Args[3]
fmt.Println(argsWithProg) fmt.Println(argsWithoutProg) fmt.Println(arg) >
Чтобы поэкспериментировать с аргументами командной строки, лучше сначала создать двоичный файл с помощью go build .
$ go build command-line-arguments.go $ ./command-line-arguments a b c d [./command-line-arguments a b c d] [a b c d] c
Далее мы рассмотрим более сложную обработку командной строки с флагами.
Main() и аргументы командной строки
Метод Main — это точка входа приложения C#. (Библиотекам и службам не требуется Main метод в качестве точки входа.) При запуске Main приложения метод является первым вызываемого метода.
В программе на C# может существовать только одна точка входа. Если у вас есть несколько классов с методом Main , программу нужно компилировать с параметром компилятора StartupObject, чтобы указать, какой из методов Main будет использоваться в качестве точки входа. Дополнительные сведения см. в разделе StartupObject (параметры компилятора C#).
class TestClass < static void Main(string[] args) < // Display the number of command line arguments. Console.WriteLine(args.Length); >>
Инструкции верхнего уровня можно также использовать в одном файле в качестве точки входа для приложения:
using System.Text; StringBuilder builder = new(); builder.AppendLine("Hello"); builder.AppendLine("World!"); Console.WriteLine(builder.ToString());
Обзор
- Метод Main — это точка входа для выполняемой программы. Это начальный и завершающий этапы управления программой.
- Main объявляется внутри класса или структуры. Main должно быть static , и это не должно быть public . (В предыдущем примере он получает доступ private по умолчанию .) Вложенный класс или структуру не требуется быть статическим.
- Main может иметь void тип , int Task или Task возвращаемый тип.
- Если только Main возвращает Task или Task , объявление Main может включать модификатор async . Это, в частности, исключает async void Main метод.
- Метод Main может быть объявлен с параметром string[] , который содержит аргументы командной строки, или без него. При использовании Visual Studio для создания приложений Windows можно добавить параметр вручную или использовать GetCommandLineArgs() метод для получения аргументов командной строки. Параметры считываются как аргументы командной строки, индексы которых начинаются с нуля. В отличие от C и C++, имя программы не рассматривается как первый аргумент командной строки в массиве args , но является первым элементом метода GetCommandLineArgs().
В следующем списке показаны допустимые Main подписи:
public static void Main() < >public static int Main() < >public static void Main(string[] args) < >public static int Main(string[] args) < >public static async Task Main() < >public static async Task Main() < >public static async Task Main(string[] args) < >public static async Task Main(string[] args)
В предыдущих примерах все используют public модификатор доступа. Это типично, но не обязательно.
Добавление значений async и Task , а также типов возвращаемого значения Task упрощает код программы, когда консольным приложениям требуется запустить и ожидать ( await ) асинхронные операции в Main .
Возвращаемые значения Main()
Вы можете возвратить int из метода Main , определив метод одним из следующих способов:
| Код метода Main | Сигнатура Main |
|---|---|
| Без использования args или await | static int Main() |
| С использованием args , без использования await | static int Main(string[] args) |
| Без использования args , с использованием await | static async Task Main() |
| С использованием args и await | static async Task Main(string[] args) |
Если значение, возвращаемое методом Main , не используется, возврат void или Task несколько упрощает код.
| Код метода Main | Сигнатура Main |
|---|---|
| Без использования args или await | static void Main() |
| С использованием args , без использования await | static void Main(string[] args) |
| Без использования args , с использованием await | static async Task Main() |
| С использованием args и await | static async Task Main(string[] args) |
Однако возврат int или Task позволяет программе передавать информацию о своем состоянии другим программам и скриптам, которые вызывают исполняемый файл.
В следующем примере показано, как можно получить доступ к коду завершения для процесса.
В этом примере используются программы командной строки .NET Core. Если вы не знакомы с программами командной строки .NET Core, можете обратиться к этой статье по началу работы.
Создайте приложение, выполнив команду dotnet new console . Измените Main метод в Program.cs следующим образом:
// Save this program as MainReturnValTest.cs. class MainReturnValTest < static int Main() < //. return 0; >>
При запуске программы в Windows значение, возвращаемое функцией Main , сохраняется в переменной среды. Эту переменную среды можно получить из пакетного файла с помощью ERRORLEVEL или в PowerShell с помощью $LastExitCode .
Для сборки приложения можно выполнить команду dotnet build интерфейса командной строки .NET.
Затем создайте скрипт PowerShell для запуска приложения и отображения результата. Вставьте следующий код в текстовый файл и сохраните его под именем test.ps1 в папке проекта. Запустите скрипт PowerShell, введя команду test.ps1 в командной строке PowerShell.
Так как код возвращает нулевое значение, пакетный файл сообщает об успехе. Но если изменить файл MainReturnValTest.cs, чтобы он возвращал ненулевое значение, и затем повторно скомпилировать программу, то при последующем выполнении скрипта PowerShell будет выдано сообщение об ошибке.
dotnet run if ($LastExitCode -eq 0) < Write-Host "Execution succeeded" >else < Write-Host "Execution Failed" >Write-Host "Return value = " $LastExitCode
Execution succeeded Return value = 0
Значения, возвращаемые асинхронным методом main
При объявлении возвращаемого значения Main компилятор создает стандартный async код для вызова асинхронных методов в Main . Если вы не указываете async ключевое слово, необходимо самостоятельно написать этот код, как показано в следующем примере. Код в примере гарантирует, что программа выполняется до завершения асинхронной операции:
class AsyncMainReturnValTest < public static void Main() < AsyncConsoleWork().GetAwaiter().GetResult(); >private static async Task AsyncConsoleWork() < // Main body here return 0; >>
Этот стандартный код можно заменить следующими способами:
class Program < static async TaskMain(string[] args) < return await AsyncConsoleWork(); >private static async Task AsyncConsoleWork() < // main body here return 0; >>
Преимущество объявления Main как async того, что компилятор всегда создает правильный код.
Если точка входа приложения возвращает Task или Task , то компилятор создает новую точку входа, которая вызывает метод точки входа, объявленный в коде приложения. Предположим, что эта точка входа называется $GeneratedMain . В этом случае компилятор создает следующий код для этих точек входа:
- static Task Main() приводит к тому, что компилятор формирует эквивалент private static void $GeneratedMain() => Main().GetAwaiter().GetResult();
- static Task Main(string[]) приводит к тому, что компилятор формирует эквивалент private static void $GeneratedMain(string[] args) => Main(args).GetAwaiter().GetResult();
- static Task Main() приводит к тому, что компилятор формирует эквивалент private static int $GeneratedMain() => Main().GetAwaiter().GetResult();
- static Task Main(string[]) приводит к тому, что компилятор формирует эквивалент private static int $GeneratedMain(string[] args) => Main(args).GetAwaiter().GetResult();
Если бы в примерах использовался модификатор async метода Main , компилятор сформировал бы точно такой же код.
Аргументы командной строки
Вы можете передавать аргументы в метод Main , определив метод одним из следующих способов:
| Код метода Main | Сигнатура Main |
|---|---|
| Без возвращаемого значения, без использования await | static void Main(string[] args) |
| С возвращаемым значением, без использования await | static int Main(string[] args) |
| Без возвращаемого значения, с использованием await | static async Task Main(string[] args) |
| С возвращаемым значением, с использованием await | static async Task Main(string[] args) |
Если аргументы не используются, можно опустить args в сигнатуре метода, чтобы немного упростить код:
| Код метода Main | Сигнатура Main |
|---|---|
| Без возвращаемого значения, без использования await | static void Main() |
| С возвращаемым значением, без использования await | static int Main() |
| Без возвращаемого значения, с использованием await | static async Task Main() |
| С возвращаемым значением, с использованием await | static async Task Main() |
Вы также можете использовать Environment.CommandLine или Environment.GetCommandLineArgs получать доступ к аргументам командной строки из любой точки в консоли или приложении Windows Forms. Чтобы включить аргументы командной строки в Main сигнатуре метода в приложении Windows Forms, необходимо вручную изменить подпись Main . Код, созданный конструктором Windows Forms, создает Main без входного параметра.
Параметр метода Main — это массив String, представляющий аргументы командной строки. Как правило, определить, существуют ли аргументы, можно, проверив свойство Length , например:
if (args.Length == 0)
Массив args не может иметь значение NULL. Поэтому доступ к свойству Length можно получить без проверки значения NULL.
Строковые аргументы также можно преобразовать в числовые типы с помощью класса Convert или метода Parse . Например, следующая инструкция преобразует string в число long с помощью метода Parse:
long num = Int64.Parse(args[0]);
Можно также использовать тип C# long , который является псевдонимом Int64 :
long num = long.Parse(args[0]);
Кроме того, можно использовать метод класса Convert , ToInt64 :
long num = Convert.ToInt64(s);
Дополнительные сведения см. в разделах Parse и Convert.
В следующем примере показано использование аргументов командной строки в консольном приложении. Приложение принимает один аргумент времени выполнения, преобразует аргумент в целое число и вычисляет факториал числа. Если не указано никаких аргументов, приложение выдает сообщение, поясняющее правильное использование программы.
Чтобы скомпилировать и запустить приложение из командной строки, выполните следующие действия.
-
Вставьте следующий код в любой текстовый редактор и сохраните файл как текстовый файл с именем Factorial.cs.
public class Functions < public static long Factorial(int n) < // Test for invalid input. if ((n < 0) || (n >20)) < return -1; >// Calculate the factorial iteratively rather than recursively. long tempResult = 1; for (int i = 1; i return tempResult; > > class MainClass < static int Main(string[] args) < // Test if input arguments were supplied. if (args.Length == 0) < Console.WriteLine("Please enter a numeric argument."); Console.WriteLine("Usage: Factorial "); return 1; > // Try to convert the input arguments to numbers. This will throw // an exception if the argument is not a number. // num = int.Parse(args[0]); int num; bool test = int.TryParse(args[0], out num); if (!test) < Console.WriteLine("Please enter a numeric argument."); Console.WriteLine("Usage: Factorial "); return 1; > // Calculate factorial. long result = Functions.Factorial(num); // Print result. if (result == -1) Console.WriteLine("Input must be >= 0 and <= 20."); else Console.WriteLine($"The Factorial of is ."); return 0; > > // If 3 is entered on command line, the // output reads: The factorial of 3 is 6.
При выполнении приложения в Visual Studio аргументы командной строки можно указать на странице «Отладка» в конструкторе проектов.
Спецификация языка C#
Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.
См. также
- System.Environment
- Отображение аргументов командной строки
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Анализ аргументов командной строки C
В коде запуска Microsoft C используются следующие правила при обработке аргументов, вводимых в командной строке операционной системы.
- Аргументы разделяются символами пробела. Это могут быть пробелы или символы табуляции.
- Первый аргумент ( argv[0] ) обрабатывается особым образом. Он представляет имя программы. Это должен быть допустимый путь, поэтому разрешены части, заключенные в двойные кавычки ( « ). Эти знаки двойных кавычек не включаются в выходные данные argv[0] . Заключение частей в двойные кавычки не позволяет интерпретировать пробел или символ табуляции как конец аргумента. Последующие правила в этом списке не применяются.
- Строка, заключенная в двойные кавычки, обрабатывается как один аргумент независимо от наличия в ней символов пробелов. Строку в кавычках можно встроить в аргумент. Символ каретки ( ^ ) не распознается как escape-символ или разделитель. Внутри заключенной в кавычки строки пара двойных кавычек интерпретируется как одна экранированная двойная кавычка. Если командная строка заканчивается раньше, чем будет найдена закрывающая двойная кавычка, все уже прочитанные символы выводятся как один последний аргумент.
- Символ двойной кавычки после обратной косой черты ( \» ) интерпретируется как литеральный символ двойной кавычки ( « ).
- Символы обратной косой черты считаются литералами, если сразу за ними не стоит двойная кавычка.
- Если двойная кавычка стоит после четного числа символов обратной косой черты, в массив argv помещается по одному символу обратной косой черты ( \ ) для каждой пары символов обратной косой черты ( \\ ), а сама двойная кавычка ( « ) интерпретируется как разделитель строк.
- Если двойная кавычка стоит после нечетного числа символов обратной косой черты, в массив argv помещается по одному символу обратной косой черты ( \ ) для каждой пары символов обратной косой черты ( \\ ). Сам знак двойной кавычки в этом случае интерпретируется как escape-последовательность в сочетании с последним символом обратной косой черты, то есть в argv помещается литерал двойной кавычки ( « ).
В следующем списке, иллюстрирующем указанные выше правила, показаны результаты, передаваемые в массив argv для нескольких примеров аргументов командной строки. Выходные данные, представленный во втором, третьем и четвертом столбцах, получены из программы ARGS.C, приведенной после списка.
| Входные данные в командной строке | argv[1] | argv[2] | argv[3] |
|---|---|---|---|
| «a b c» d e | a b c | d | e |
| «ab\»c» «\\» d | ab»c | \ | d |
| a\\\b d»e f»g h | a\\\b | de fg | h |
| a\\\»b c d | a\»b | c | d |
| a\\\\»b c» d e | a\\b c | d | e |
| a»b»» c d | ab» c d |
Пример
Код
// ARGS.C illustrates the following variables used for accessing // command-line arguments and environment variables: // argc argv envp // #include int main( int argc, // Number of strings in array argv char *argv[], // Array of command-line argument strings char **envp ) // Array of environment variable strings < int count; // Display each command-line argument. printf_s( "\nCommand-line arguments:\n" ); for( count = 0; count < argc; count++ ) printf_s( " argv[%d] %s\n", count, argv[count] ); // Display each environment variable. printf_s( "\nEnvironment variables:\n" ); while( *envp != NULL ) printf_s( " %s\n", *(envp++) ); return; >
Ниже приведен один пример данных, выводимых этой программой:
Command-line arguments: argv[0] C:\MSC\ARGS.EXE Environment variables: COMSPEC=C:\NT\SYSTEM32\CMD.EXE PATH=c:\nt;c:\binb;c:\binr;c:\nt\system32;c:\word;c:\help;c:\msc;c:\; PROMPT=[$p] TEMP=c:\tmp TMP=c:\tmp EDITORS=c:\binr WINDIR=c:\nt
Завершение блока, относящегося только к системам Майкрософт
Что такое argc, char * argv[] в Си
В Си все функции в исполняемом файле вызываются из функции main ().
Функция main () тоже должна быть вызвана. Например, из bash .
Вызов может быть как без аргументов, так и с аргументами.
Начнём с первого варианта
Вызов без аргументов
Если Вы не собираетесь использовать аргументы командной строки, то можно писать int main ()
Что вообще под этим имеется в виду:
Рассмотрим простейшую программу, которую мы написали в файле hello_world.c
#include int main ( int argc, char * argv[])
Предположим, что мы скомпилировали наш hello_world.c в object файл hello_world командой
gcc -o hello_world hello_world.c
И теперь выполняем
Нам совершенно не важно написано
int main ( int argc, char * argv[])
просто int main ()
В какой момент это станет важным?
— В тот момент когда нужно будет вызывать с аргументами
Вызов с аргументами
argc — argument count — это количество аргументов командной строки.
Тип argc — int
Минимально значение argc это 1. argv[0] это имя программного файла (в нашем случае программный файл это hello_world.c).
Си это очень старый язык, созданный задолго до появления современных графических интерфейсов.
char * — это тип возвращаемого значени
argv[] — argument vector — массив значений этих аргументов
Рассмотрим другую программу, написанную в файле example.c
Она будет ожидать два аргумента типа int .
В коде они будут называться a1 и a2. Обратите внимание на седьмую и восьмую строки.
#include #include int main ( int argc, char * argv[])
Скомпилируйте этот код командой
gcc -o example example.c
Осталось вызвать программу и передать при вызове аргументы прямо в командной строке.
File name = ./example
7 9
Мы вызываем example и прямо в командной строке передаём два аргумента.
Сперва мы убедились что argv[0] это действительно имя файла. Затем увидели переданные аргументы
Теперь, если Вы захотите убрать int argc, char * argv[] из main
Компилятор Вас не поймёт и пожалуется на необъявленные argv
example.c: In function ‘main’: example.c:7:16: error: ‘argv’ undeclared (first use in this function) int a0=atoi(argv[0]); ^~~~ example.c:7:16: note: each undeclared identifier is reported only once for each function it appears in
Если убрать все упоминания о аргументах командной строки из кода и попробовать запустить программу с аргументами — они буду проигнорированы.
gcc -o example example.c
./example 7 9
В других языках
В Python аналогичную функцию выполняет sys.argv