【发布时间】:2014-12-19 11:32:01
【问题描述】:
所以,我可以让我的程序运行起来,但如果我有的话
$ ./a.out -f Text.txt
我只是不确定如何让程序建立 -f 指示文件的连接。这样做的逻辑是什么?
【问题讨论】:
-
在 C 运行时中查找“getopt()”函数(如果您使用的是 Unix 机器,则为“man getopt”)。
标签: c unix command-line-arguments
所以,我可以让我的程序运行起来,但如果我有的话
$ ./a.out -f Text.txt
我只是不确定如何让程序建立 -f 指示文件的连接。这样做的逻辑是什么?
【问题讨论】:
标签: c unix command-line-arguments
main 函数有签名int main(int argc, char**argv);所以你可以使用argc(这是积极的)和argv参数。 argv 数组保证有 argc+1 元素。最后一个总是NULL。其他的是非零、非别名的零字节终止字符串。请注意,在您的程序由execve(2) 启动之前,通常一些shell 是globbing 的参数:参见glob(7)。
例如,如果您键入(在 Linux 终端中)myprog -i a*.c -o foo.txt,并且此时您键入的 shell 已扩展(通过 globbing)a*.c 到 a1.c 和 a2.c(因为这些是唯一名称以a 开头并在当前目录中有.c 后缀的文件),您的myprog 可执行main 程序被调用
argc==6argv[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 来解析这些参数:getopt 和argp。 getopt 在 POSIX 中是标准化的(但 GNU 也为您提供了非常有用的 getopt_long(3))
我强烈建议你关注GNU conventions:至少接受--help 和--version
事实上,例如-f 用于某些选项,而不是文件名通常是常规的(但请参阅在程序参数中使用 --)。如果您碰巧真的想要一个名为-f 的文件(这是一个非常糟糕的主意),请使用./-f
几个 shell 有autocompletion。您需要为此配置它们(甚至可以为您自己的程序配置它们)。
【讨论】: