【问题标题】:Command-line Parameters in C program?C程序中的命令行参数?
【发布时间】:2016-02-22 03:39:05
【问题描述】:

如何读取 C 中的命令行参数?例如,在

./test --help

./test --build

如何访问“--build”或“--help”?

【问题讨论】:

  • 命令行参数是主函数的一部分。

标签: c parameters


【解决方案1】:

您的参数在 argv 中:

int main(int argc, char **argv)

如果你打印 argv 的内容(argv[0]、argv[1] 等),你就会明白了。

尝试:

int main (int argc, char **argv)
{
    for(int i = 0;i< argc;i++) 
        printf("%s\r\n",argv[i]);
}

【讨论】:

    【解决方案2】:

    您可以将argcargv 参数用于main 函数,并根据它们做不同的事情:

    #include <string.h>
    void dohelp(void) { /* whatever; */ }
    void dobuild(void) { /* whatever; */ }
    int main(int argc, char **argv) {
        if (argc == 2) {
            if (!strcmp(argv[1], "--help")) dohelp();
            if (!strcmp(argv[1], "--build")) dobuild();
        }
        return 0;
    }
    

    argc 包含由 shell 传递给程序的参数数量,包括程序名称。所以myapp --help 的 argc 为 2。

    argv 是参数本身。最后一个 argv (argv[argc]) 是 NULL 指针。


    编辑:参数不需要命名为argcargv,但是命名其他的东西非常非常不好!

    int main(int foo, char **bar) /* RGAGGGGHH */
    int main(int n, char **options) /* RGAGGGGHH */
    

    【讨论】:

    • 如果 strcmp 返回 true(例如不匹配)那么它说分段错误?
    • 在 strcmp 之前有一个! 以使其匹配
    • 谢谢!正是需要的。虽然 不需要包含 strcmp 只是 stdio.h
    • /* RGAGGGGHH */ 不要犹豫。告诉我们您真正的想法。
    • @Daniel:strcmp() 的声明位于 string.hstdio.h 恰好包含 string.h。包含string.hstdio.h 并没有什么坏处,但我会这样做。
    【解决方案3】:

    最基本的是使用参数(int argc, char *argv[]),你可以直接解析。

    一种更高级的方法是使用getopt...http://www.gnu.org/s/libc/manual/html_node/Getopt.html

    【讨论】:

      【解决方案4】:

      命令行参数是通过名称传递给程序的参数。例如,UNIX 程序 cp(复制两个文件)具有以下命令行参数:

      cp SOURCE DEST

      您可以使用argcargv 访问命令行参数:

      int main(int argc, char *argv[])
      {
          return 0;
      }
      

      argc 是参数的数量,包括程序名称,而 argv 是包含参数的字符串数组。 argv[0]是程序名,argv[argc]保证是NULL指针。

      所以cp 程序可以这样实现:

      int main(int argc, char *argv[])
      {
          char *src = argv[1];
          char *dest = argv[2];
      
          cpy(dest, src);
      }
      

      它们不必命名为argcargv;他们可以有任何你想要的名字,尽管传统上他们是这样称呼的。

      【讨论】:

        【解决方案5】:

        [像往常一样]有几种方法可以做到这一点。 从 argv 读取命令行参数(与 argc 一起传递给 main)。

        您可以自己解析这些,并在每次在 argv 中找到新选项时进行位开关设置标志。或者您可以使用库来解析命令行参数。我建议使用 libc getopt(谷歌搜索)。

        【讨论】:

          猜你喜欢
          • 2016-10-26
          • 2018-10-05
          • 1970-01-01
          • 2011-04-21
          • 1970-01-01
          • 1970-01-01
          • 2012-04-17
          • 2011-08-28
          相关资源
          最近更新 更多