这里说的解析命令行参数,并不是说类似getopt的解析函数,而是说win平台的命令行参数是按什么规则传入程序的。前两天我写了个命令行的程序,程序对根目录的处理总是有问题。经过跟踪,发现当输入参数是(“D:\”)的时候,实际程序读到的参数是(D:”)。在路径的两端加上引号,是为了让路径名称中出现空格的时候不会作为参数分隔符处理。可是显然最后一个引号被\转移为 ” 了。
求助于MSDN,终于找到了命令行解析的规则,原文链接:http://msdn2.microsoft.com/en-us/library/aa243471.aspx。这里我做一下翻译:
- 参数用空格或者TAB进行分割。
- 一个字符串若被两个双引号包含,则即使其中包含空格或TAB字符也会被视为一个参数。被引起来的字符串可以嵌入参数内。
- 字符串中存在的双引号可以通过前置反斜杠进行转义。
- 反斜杠会被解释成单个字符,除非后面紧接着一个双引号。
- 如果偶数个反斜杠后面跟随一个双引号,每对反斜杠放一个反斜杠到参数中,双引号被解释为一个字符串界定符。
- 如果奇数个反斜杠后面跟随一个双引号,每对反斜杠放一个反斜杠到argv数组中,双引号则被剩下的反斜杠转义放入到argv中,而不会作文字符串界定符。
这里有几个例子,一看就明白了:
| Command-Line Input | 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 |