<分区>
所以,我可以让我的程序全部运行,但如果给定的话
$ ./a.out -f Text.txt
我只是不确定如何让程序建立 -f 表示文件的连接。这样做的逻辑是什么?
<分区>
所以,我可以让我的程序全部运行,但如果给定的话
$ ./a.out -f Text.txt
我只是不确定如何让程序建立 -f 表示文件的连接。这样做的逻辑是什么?
最佳答案
main
函数的签名是int main(int argc, char**argv)
;所以你可以使用 argc
(这是肯定的)和 argv
参数。 argv
数组保证包含 argc+1
元素。最后一个总是 NULL
。其他的是非零、非别名的零字节终止字符串。请注意,通常有些 shell是globbing execve(2) 启动程序之前的参数:见glob(7) .
例如,如果您(在 Linux 终端中)键入 myprog -i a*.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
指针都是不同的,非 aliasing , 且不重叠。
GNU libc 给你 several ways解析这些参数:getopt & argp . getopt在 POSIX 中是标准化的(但 GNU 也为您提供了非常有用的 getopt_long(3) )
强烈建议您关注GNU conventions : 至少接受 --help
和 --version
事实上,例如-f
用于某些选项,而不是文件名通常是常规的(但请参阅 --
在程序参数中的使用)。如果你碰巧真的想要一个名为 -f
的文件(这是一个非常糟糕的主意),请使用 ./-f
几个壳有autocompletion .您需要为此配置它们(甚至可以为您自己的程序配置它们)。
关于c - 处理命令行参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26534179/