解析命令行参数规则 (Parsing C Command-Line Arguments)

这里说的解析命令行参数,并不是说类似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

About 王永杰

路漫漫其修远兮,吾将上下而求索
This entry was posted in C&C++, 技术为本. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>