剖析 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 特定