处理命令行参数?

时间:2014-10-23 17:47:05

标签: c unix command-line-arguments

所以,我可以让我的程序运行所有,但如果我已经给出了

$ ./a.out -f Text.txt

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

1 个答案:

答案 0 :(得分:2)

main函数具有签名int main(int argc, char**argv);所以你可以使用argc(这是积极的)& argv个论点。 argv数组保证包含argc+1个元素。最后一个始终是NULL。其他是非零,无别名的零字节终止字符串。请注意,在shell启动程序之前,通常有globbing execve(2)个参数为glob(7):请参阅globbing

例如,如果您键入(在Linux终端中)myprog -i a*.c -o foo.txt,并且当您键入时,shell已将(execve(2)a*.c扩展为a1.c }和a2.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指针

此外,保证(由内核执行aliasing),所有6个argv指针都是不同的,非several ways和非重叠。

GNU libc为您提供getopt来解析这些参数:argp& getoptgetopt_long(3)在POSIX中标准化(但GNU也为您提供了非常有用的GNU conventions

我强烈建议您关注autocompletion:至少接受--help--version

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

有几个炮弹{{3}}。您需要为此配置它们(您甚至可以为自己的程序配置它们)。