c - 处理命令行参数?

标签 c unix command-line-arguments

<分区>

所以,我可以让我的程序全部运行,但如果给定的话

$ ./a.out -f Text.txt

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

最佳答案

main 函数的签名是int main(int argc, char**argv);所以你可以使用 argc (这是肯定的)和 argv 参数。 argv 数组保证包含 argc+1 元素。最后一个总是 NULL。其他的是非零、非别名的零字节终止字符串。请注意,通常有些 shellglobbing execve(2) 启动程序之前的参数:见glob(7) .

例如,如果您(在 Linux 终端中)键入 myprog -i a*.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 指针都是不同的,非 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/

相关文章:

c - 一旦对命令行参数使用 printf() ,它们会发生什么?

linux - 从 Linux 命令行在 MATLAB 中运行选择

C 跳行以 '#' 开头

c - while循环中读入

java - 用 Java 遍历 Linux/Unix 文件系统?

linux - 帮助查找和替换字符串的 Shell 脚本

python - 通过 Python 连接 CISCO Anyconnect VPN

java - 在 Windows 命令行上,如何将 cat 的输出输入到 java main 方法中?

c - 递归换位密码C

c++ - 无法找到 C++ 标准库头文件中未定义的宏