<i id='92emd'></i>
    <span id='92emd'></span>

    <i id='92emd'><div id='92emd'><ins id='92emd'></ins></div></i>
    <dl id='92emd'></dl>

        <fieldset id='92emd'></fieldset>
      1. <tr id='92emd'><strong id='92emd'></strong><small id='92emd'></small><button id='92emd'></button><li id='92emd'><noscript id='92emd'><big id='92emd'></big><dt id='92emd'></dt></noscript></li></tr><ol id='92emd'><table id='92emd'><blockquote id='92emd'><tbody id='92emd'></tbody></blockquote></table></ol><u id='92emd'></u><kbd id='92emd'><kbd id='92emd'></kbd></kbd>
        <acronym id='92emd'><em id='92emd'></em><td id='92emd'><div id='92emd'></div></td></acronym><address id='92emd'><big id='92emd'><big id='92emd'></big><legend id='92emd'></legend></big></address>

          <code id='92emd'><strong id='92emd'></strong></code>
          <ins id='92emd'></ins>

        1. 使用 getopt() 进行命令行处理

          • 时间:
          • 浏览:3
          • 来源:124软件资讯网

            弁言

              在早期的 UNIX? 中  ,其下令行情况(其时的唯一用户界面)包罗着数十种小的文本处置惩罚工具  。这些工具很是小 ,通常可很好地完成一项事情 。这些工具通过较长的下令管道链接在一起  ,前面的法式将其输出通报给下一个法式以作为输入  ,整个历程由种种下令行选项和参数加以控制  。

              正是 UNIX 的这方面的特征使其成为了极为强盛的处置惩罚基于本文的数据的情况  ,而这也是其在公司情况中的最初用途之一  。在下令管道的一端输入一些文本 ,然后在另一端检索经由处置惩罚的输出  。

              下令行选项和参数控制 UNIX 法式  ,见告它们怎样行动  。作为开发职员 ,您要卖力从通报给您法式的 main() 函数的下令行发现用户的意图 。本文将演示怎样使用尺度 getopt() 和 getopt_long() 函数来简化下令行处置惩罚事情  ,并讨论了一项用于跟踪下令行选项的手艺 。

              最先之前

              本文包罗的示例代码(请参见下载)是使用 C 开发工具(C Development Tooling  ,CDT)在 Eclipse 3.1 中编写的;getopt_demo 和 getopt_long_demo 项目是 Managed Make 项目 ,均使用 CDT 的法式天生规则构建  。在项目中没有包罗 Makefile ,若是需要在 Eclipse 外编译代码 ,可以自己利便地天生一个  。

              若是尚未实验过 Eclipse(请参阅参考资料) ,真的应该实验一下——这是一个优异的集成开发情况(integrated development environment  ,IDE)  ,其每个新版本都有较大的提升 。这是来自“强硬派” EMACS 和 Makefile 开发职员的作品  。

              下令行

              在编写新法式时 ,首先遇到的障碍之一就是怎样处置惩罚控制其行为的下令行参数 。这包罗从下令行通报给您法式的 main() 函数的一个整数计数(通常名为 argc)和一个指向字符串的指针数组(通常名为 argv).可以接纳两种实质一样的方式声明标注 main() 函数  ,如清单 1 中所示 。

              清单 1. 声明 main() 函数的两种方式

              int main( int argc, char *argv[] );int main( int argc, char **argv );

              第一种方式使用的是指向 char 指针数组  ,现在似乎很盛行这种方式 ,比第二种方式(其指针指向多个指向 char 的指针)略微清晰一些  。由于某些缘故原由  ,我使用第二种方式的时间更多一些  ,这可能源于我在高中时艰难学习 C 指针的履历  。对于所有的用途和目的  ,这两种要领都是一样的  ,因此可以使用其中您自己最喜欢的方式 。

              当 C 运行时库的法式启动代码挪用您的 main() 时 ,已经对下令行举行了处置惩罚  。argc 参数包罗参数的计数值  ,而 argv 包罗指向这些参数的指针数组  。对于 C 运行时库  ,arguments 是法式的名称  ,法式名后的任何内容都应该使用空格加以分开  。

              例如  ,若是使用参数 -v bar www.ibm.com 运行一个名为 foo 法式 ,您的 argc 将设置为 4  ,argv 的设置情形将如清单 2 中所示 。

              清单 2. argv 的内容

              argv[0] - fooargv[1] - -vargv[2] - barargv[3] - www.ibm.com

              一个法式仅有一组下令行参数 ,因此我要将此信息存储在记载选项和设置的全局结构中  。对法式有意义的要跟踪的任何内容都可以记载到此结构中 ,我将使用结构来资助淘汰全局变量的数目  。正如我在网络服务设计文章(请参阅参考资料)所提到的  ,全局变量很是不适适用于线程化编程中  ,因此要审慎使用  。

              示例代码将演示一个设想的 doc2html 法式的下令行处置惩罚  。该 doc2html 法式将某种类型的文档转换为 HTML  ,详细由用户指定的下令行选项控制 。它支持以下选项:

              -I——不建立要害字索引  。

              -l lang——转换为使用语言代码 lang 指定的语言 。

              -o outfile.html——将经由转换的文档写入到 outfile.html  ,而不是打印到尺度输出  。

              -v——举行转换时提供详细信息;可以多次指定  ,以提高诊断级别  。

              将使用其他文件名称来作为输入文档 。

              您还将支持 -h 和 -?  ,以打印资助新闻来提醒各个选项的用途 。

              简朴下令行处置惩罚: getopt()

              getopt() 函数位于 unistd.h 系统头文件中 ,其原型如清单 3 中所示:

              清单 3. getopt() 原型

              int getopt( int argc, char *const argv[], const char *optstring );

              给定了下令参数的数目 (argc)、指向这些参数的数组 (argv) 和选项字符串 (optstring) 后  ,getopt() 将返回第一个选项  ,并设置一些全局变量  。使用相同的参数再次挪用该函数时  ,它将返回下一个选项  ,并设置响应的全局变量  。若是不再有识别到的选项  ,将返回 -1  ,此使命就完成了  。

              getopt() 所设置的全局变量包罗:

              optarg——指向当前选项参数(若是有)的指针  。

              optind——再次挪用 getopt() 时的下一个 argv 指针的索引  。

              optopt——最后一个已知选项  。

              对于每个选项 ,选项字符串 (optstring) 中都包罗一个对应的字符  。具有参数的选项(如示例中的 -l 和 -o 选项)后面跟有一个 : 字符 。示例所使用的 optstring 为 Il:o:vh?(前面提到 ,还要支持最后两个用于打印法式的使用要领新闻的选项)  。

              可以重复挪用 getopt()  ,直到其返回 -1 为止;任何剩下的下令行参数通常视为文件名或法式响应的其他内容  。

              getopt() 的使用

              让我们对 getopt_demo 项目的代码举行一下深入剖析;为了利便起见 ,我在此处将此代码拆分为多个部门  ,但您可以在可下载源代码部门获得完整的代码(请参见下载)  。

              在清单 4 中  ,可以看到系统演示法式所使用的系统头文件;尺度 stdio.h 提供尺度 I/O 函数原型 ,stdlib.h 提供 EXIT_SUCCESS 和EXIT_FAILURE  ,unistd.h 提供 getopt() 。

              清单 4. 系统头文件

              #in123456下一页