剖析 C 命令列引數
Microsoft 特定的
Microsoft C 啟動程式碼在解譯作業系統命令列所指定的引數時會使用下列規則:
自變數會以空格符分隔,這些字元為空格或製表元。
第一個引數 (
argv[0]
) 是特別處理。 這代表程式名稱。 因為這必須是有效的路徑名稱,所以允許以雙引號 ("
) 括住的部分。argv[0]
輸出中未包含雙引號標記。 以雙引弧括住的部分可防止將空格或定位字元解譯為引數的結尾。 此清單中的後續規則不適用。以雙引弧括住的字串會解譯為單一自變數,不論它是否包含空格符。 有引號的字串可以內嵌到引數中。 插入號 (
^
) 不會被辨識為逸出字元或分隔符號。 在引號字串中,一對雙引號會解譯為單一逸出雙引號標記。 如果命令行在找到結尾雙引號之前結束,則到目前為止讀取的所有字元都會輸出為最後一個引數。前面有反斜線 (
\"
) 的雙引號會解譯為常值雙引號 ("
)。反斜線會逐字解譯,除非後面緊接著雙引號。
如果雙引號前面有偶數數目的反斜線,則會將每一對反斜線 (
\\
) 的其中一個反斜線 (\
) 放到argv
陣列中,並將雙引號 ("
) 解譯為字串分隔符號。如果雙引號前面有奇數數目的反斜線,則會將每一對反斜線 (
\\
) 的的其中一個反斜線 (\
) 放在argv
陣列中。 雙引號被其餘反斜線解譯為逸出序列,導致常值雙引號 ("
) 置於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 <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;
}
此程式輸出的其中一個範例是:
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 特定的