处理命令行参数?

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

$ ./a.out -f Text.txt 

我只是不知道如何让程序来连接,-f表示一个文件。 这样做的逻辑是什么?

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

例如,如果你输入(在Linux终端中) myprog -ia*.c -o foo.txt并且如果你现在输入的话,那么shell已经扩展(通过globbing ) a*.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指针都是独立的,没有别名的 ,而且是不重叠的。

GNU libc给了你几种分析这些参数的方法: getopt & argp 。 getopt在POSIX中被标准化(而GNU给你也是非常有用的getopt_long(3) )

我强烈建议你遵循GNU约定 :至少接受--help--version

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

几个shell有自动完成 。 你需要为它配置它们(甚至可以为你自己的程序配置它们)。