【问题标题】:Command line inputs as arguments命令行输入作为参数
【发布时间】:2013-10-10 04:31:01
【问题描述】:

我正在为一个班级设计一个程序,其中一条指令是使用命令行输入。例如,当您运行main -n 5 3 时,它会将53 作为参数。什么是-n

如何在带有代码块而不是 linux 机器的 PC 上进行测试?
我的程序将如何读取这些内容?
我是否需要将我的文件命名为 main ,然后在 main 中有两个参数可以适当地传入?

【问题讨论】:

  • -nargv[1]5argv[2]3argv[3]
  • 我不明白 -n 在我的程序中应该代表什么,我只需要两个参数,5 和 3。
  • 这个程序是你自己写的吗?如果是这样,那么您可以选择-n 的含义,以及它是否完全接受。当您发现意外的参数时,您始终可以打印错误消息并中止程序。
  • 令人困惑的是我只需要两个变量。描述它的文档说 -n 与第一个数字参数有关。

标签: c command-line command-line-arguments


【解决方案1】:

你程序中的main函数有原型

int main (int argc, char ** argv);

其中argc 将包含传递的参数数量,argv 是指向char* 数组的指针,其中包含以空字符结尾的字符串形式的参数。

通常argv[0] 包含您的程序名称,argv[1] 您的第一个参数等等。在您的情况下,当您使用参数-n 5 3 运行程序时,您将拥有

argv[1] = "-n"
argv[2] = "5"
argv[3] = "3"

【讨论】:

  • 这是有道理的,所以我可以访问数组来分配这些整数以在我的程序中使用。这是我可以在 Windows 上测试的东西吗?
  • @PaulthePirate 是的,但请记住它们以字符串的形式出现。您需要先使用atoi 或类似函数将它们转换为整数。尝试使用以下命令打印您的论点:int i; for (i = 0; i < argc; i++) printf("%s\n", argv[i]);
  • @luiscubal 在 C 的 for 循环中不能有类型声明,这是 C++ 扩展。
  • @SergeyL。我很确定它是有效的 C99,事实上,我怀疑即使在 C89 中它也可以工作——它只是具有“错误”的范围,尽管 GCC 似乎显示了一个错误。不管怎样,这里有另一种写同样东西的方法:pastebin.com/TFK5uTmb
  • 是 int n = atoi(argv[1]);有效吗?
【解决方案2】:

正如其他人所指出的,参数在 argv[...] 中。在现实世界中,很多人使用getopt 之类的东西来解析参数,因为它非常健壮并且已经过测试。

【讨论】:

    【解决方案3】:

    通常 C 使用 argc 和 argv 来允许您索引从命令行传递的参数。我已经有一段时间没有在 PC 上工作了,但是当我这样做时,代码与 Unix 一致。

    #include <stdio.h>
    
    int main (int argc, char *argv[]) {
      printf("Total args count=%s\n", argc);
      printf("Command=%s\n", argv[0]);
    
      for (i=1; i< argc; i++) {
        printf("\narg%d=%s", i, argv[i]);
      }
    
      printf("\n");
      return 0;
    }
    

    这会返回

    Total Args 4
    Command main 
      1 = -n 
      2 = 5 
      3 = 3
    

    【讨论】:

      【解决方案4】:

      a.exe -n 5 3

      导致argv的内容如下:

      argv[0] = a.exe
      argv[1] = -n
      argv[2] = 5
      argv[3] = 3
      argv[4] = @987654

      argc 将是4


      在 linux 上,unistd.h 中有一个 getopt 函数可以帮助您检索 n 选项并解析后面的参数。但是,如果您的程序只需要找到 -n 并从后面的两个参数中读取值,您可以这样做:

      int i, x = 0, y = 0;
      for (i = 0; i < argc; i++) {
          if (strcmp(argv[i], "-n") == 0 && i + 2 < argc) {
              x = atoi(argv[i+1]);
              y = atoi(argv[i+2]);
          }
      }
      

      【讨论】:

      • 我没有 linux,所以我无法真正测试它,但我的文件需要在 linux 上运行,所以我想在迁移到 linux 之前进行尽可能多的测试。
      • @PaulthePirate:我已经更新了我的答案 + 添加了一些额外的信息 :)
      • 将 int n = atoi(argv[1]); char* 地址 = argv[2];工作?假设最后一个输入是一个字符串
      • @PaulthePirate:是的。虽然您可能想要 argv[2]argv[3](不是 1 和 2,因为 1 是 -n
      猜你喜欢
      • 2010-09-16
      • 2016-02-24
      • 1970-01-01
      • 2014-02-19
      • 2014-03-29
      • 2015-07-20
      • 2021-01-18
      • 2019-03-01
      • 2019-02-27
      相关资源
      最近更新 更多