所以,我可以让我的程序运行和所有,但如果我给了
$ ./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*.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
指针 另外,你可以保证(内核执行execve(2) ),所有的6个argv
指针都是独立的,没有别名的 ,而且是不重叠的。
GNU libc给了你几种分析这些参数的方法: getopt & argp 。 getopt在POSIX中被标准化(而GNU给你也是非常有用的getopt_long(3) )
我强烈建议你遵循GNU约定 :至少接受--help
和--version
事实上,例如-f
是一些选项,而不是一个文件名是常规的(但在程序参数中使用)。 如果碰巧真的需要一个名为-f
的文件 (这是一个非常糟糕的主意),请使用./-f
几个shell有自动完成 。 你需要为它配置它们(甚至可以为你自己的程序配置它们)。