Analizowanie argumentów wiersza polecenia języka C
Specyficzne dla firmy Microsoft
Kod startowy microsoft C używa następujących reguł podczas interpretowania argumentów podanych w wierszu polecenia systemu operacyjnego:
Argumenty są rozdzielane znakami odstępów, które są spacjami lub tabulatorami.
Pierwszy argument (
argv[0]
) jest traktowany specjalnie. Reprezentuje nazwę programu. Ponieważ musi być prawidłową nazwą ścieżki, części otoczone podwójnymi cudzysłowami ("
) są dozwolone. Znaki podwójnego cudzysłowu nie są uwzględniane w danych wyjściowychargv[0]
. Części otoczone podwójnym cudzysłowem uniemożliwiają interpretację znaku spacji lub tabulatora jako końca argumentu. Późniejsze reguły na tej liście nie mają zastosowania.Ciąg otoczony podwójnym cudzysłowem jest interpretowany jako pojedynczy argument, niezależnie od tego, czy zawiera znaki odstępu, czy nie. Ciąg cudzysłów można osadzić w argumencie. Daszek (
^
) nie jest rozpoznawany jako znak ucieczki lub ogranicznik. W cudzysłowie parą podwójnych znaków cudzysłowu jest interpretowana jako pojedynczy znak cudzysłowu z znakiem ucieczki. Jeśli wiersz polecenia kończy się przed odnalezieniem zamykającego podwójnego cudzysłowu, wszystkie znaki odczytane do tej pory są danymi wyjściowymi jako ostatni argument.Podwójny cudzysłów poprzedzony ukośnikiem odwrotnym (
\"
) jest interpretowany jako znak podwójnego cudzysłowu literału ("
).Ukośniki odwrotne są interpretowane dosłownie, chyba że bezpośrednio poprzedzają znak podwójnego cudzysłowu.
Jeśli po znaku podwójnego cudzysłowu następuje parzysta liczba ukośników odwrotnych (), jeden ukośnik odwrotny (
\
) jest umieszczany wargv
tablicy dla każdej pary ukośników odwrotnych (\\
), a znak podwójnego cudzysłowu ("
) jest interpretowany jako ogranicznik ciągu.Jeśli po znaku podwójnego cudzysłowu następuje nieparzysta liczba ukośników odwrotnych (), jeden ukośnik odwrotny (
\
) zostanie umieszczony wargv
tablicy dla każdej pary ukośników odwrotnych (\\
). Znak podwójnego cudzysłowu jest interpretowany jako sekwencja ucieczki przez pozostały ukośnik odwrotny, co powoduje umieszczenie literału podwójnego cudzysłowu ("
) w obiekcieargv
.
Ta lista ilustruje powyższe reguły, pokazując wynik interpretowany przekazany do argv
dla kilku przykładów argumentów wiersza polecenia. Dane wyjściowe wymienione w drugiej, trzeciej i czwartej kolumnie pochodzą z usługi ARGS. Program języka C, który jest zgodny z listą.
Dane wejściowe wiersza polecenia | 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 |
Przykład
Kod
// ARGS.C illustrates the following variables used for accessing
// command-line arguments and environment variables:
// argc argv envp
//
#include <stdio.h>
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;
}
Jednym z przykładów danych wyjściowych z tego programu jest:
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
END Microsoft Specific