【问题标题】:Handle command line arguments? [duplicate]处理命令行参数? [复制]
【发布时间】:2014-12-19 11:32:01
【问题描述】:

所以,我可以让我的程序运行起来,但如果我有的话

$ ./a.out -f Text.txt

我只是不确定如何让程序建立 -f 指示文件的连接。这样做的逻辑是什么?

【问题讨论】:

  • 在 C 运行时中查找“getopt()”函数(如果您使用的是 Unix 机器,则为“man getopt”)。

标签: c unix command-line-arguments


【解决方案1】:

main 函数有签名int main(int argc, char**argv);所以你可以使用argc(这是积极的)和argv参数。 argv 数组保证有 argc+1 元素。最后一个总是NULL。其他的是非零、非别名的零字节终止字符串。请注意,在您的程序由execve(2) 启动之前,通常一些shellglobbing 的参数:参见glob(7)

例如,如果您键入(在 Linux 终端中)myprog -i a*.c -o foo.txt,并且此时您键入的 shell 已扩展(通过 globbinga*.ca1.ca2.c(因为这些是唯一名称以a 开头并在当前目录中有.c 后缀的文件),您的myprog 可执行main 程序被调用

  • argc==6
  • argv[0] 包含 "myprog"(所以你可以测试 strcmp(argv[0],"myprog") == 0
  • argv[1] 包含 "-i"
  • argv[2] 包含 "a1.c"
  • argv[3] 包含 "a2.c"
  • argv[4] 包含 "-o"
  • argv[5] 包含 "foo.txt"
  • argv[6]NULL 指针

此外,您可以保证(通过内核执行execve(2))所有 6 个argv 指针都是不同的、非aliasing 且不重叠。

GNU libc 为您提供several ways 来解析这些参数:getoptargpgetopt 在 POSIX 中是标准化的(但 GNU 也为您提供了非常有用的 getopt_long(3)

我强烈建议你关注GNU conventions:至少接受--help--version

事实上,例如-f 用于某些选项,而不是文件名通常是常规的(但请参阅在程序参数中使用 --)。如果您碰巧真的想要一个名为-f文件(这是一个非常糟糕的主意),请使用./-f

几个 shell 有autocompletion。您需要为此配置它们(甚至可以为您自己的程序配置它们)。

【讨论】:

    猜你喜欢
    • 2012-11-24
    • 2015-05-01
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    相关资源
    最近更新 更多