【问题标题】:How to check if an argument was given or not?如何检查是否给出了参数?
【发布时间】:2013-06-05 03:29:09
【问题描述】:
//Checks if an argument was specified
if (argv[1] != "")
    strcpy(Buff1, argv[1]);
else
    strcpy(Buff1, "default");

如果我运行: ./program test

Buff1 = 测试

如果我运行: ./program

Buff1 = PACKAGES/=包

如果未指定任何内容,我该如何做到这一点,Buff1 将默认为“默认”?

【问题讨论】:

  • 这就是argc 存在的原因(有点,因为argv 以空字符串结尾)。
  • 请不要编辑问题以包含解决方案。您使答案无效,这对任何人都没有帮助。

标签: c++ argv argc


【解决方案1】:

建议: 使用 argv.size() 来获取计数。

【讨论】:

  • argvchar**。它没有成员函数。
【解决方案2】:

使用argc 了解主要参数的传递方式。 Shell 或进程调用程序通常为程序提供至少一个参数,即程序名称本身,并且始终是第一个参数。原来argc=1至少是程序名,argv[0]是程序名。

  int main(int argc, char **argv){
      // declarations and all here
      if(argc<2){
         strcpy(Buff1, "default");

        }
       else{
          strcpy(Buff1, argv[1]);
      }
     return 0;
  }

如果不使用它,您会遇到两个问题。当你使用argv[1] 时,当argc=1 时,你实际上是在数组越界。因为,c++ 不会为您做任何边界检查,有时您的程序可能会在静默访问 argv[0] 旁边的内存地址时失败。另一个问题是您试图将字符串与!= 运算符进行比较。您不能立即使用 ==/!= 运算符比较字符串文字。您必须使用strcmp 或等效函数。

【讨论】:

    【解决方案3】:

    好的,如果什么都没有传递,argc 将变为 1(argc 给出传递参数的数量)。这意味着唯一包含任何内容的 argv 元素将是 argv[0](其中包含程序的名称)。这意味着对 argv[1] 的调用将是一个超出范围的索引,可能会导致崩溃,或者如果你幸运的话只会是垃圾数据。

    if(argc == 1)
       strcpy(Buff1, "default");
    
    else if(argc == 2)
        strcpy(Buff1, argv[1]);
    
    else
        //do something here if there is more than 1 argument passed to it
    

    还值得注意的是,您传递示例参数的方式不适用于您的意图:“./program test Buff1 = test”将导致 argc 为 4,而 argv[0] 为“test ", argv[1] 是 "Buff1", argv[2] 是 "=", argv[3] 是 "test"。

    只需调用“./program test hellooo”就可以使用我提供的程序片段,用“helllooo”填充 Buff1。调用“./program test”也可以,用“default”填充 Buff1。要进行更高级的操作,您将不得不使用命令行开关(例如 ./program test -b somethinghere -x somethinghere),这只是解析 argc 和 argv 的一种更高级的方法。

    【讨论】:

      【解决方案4】:

      argc 为您提供传递给程序的参数数量。 请记住,argc 不能小于 1,因为 argv[0] 始终是程序的名称,所以如果没有传递参数,您应该使用这个 if(argc == 1){}

      【讨论】:

        【解决方案5】:

        使用argc 确定参数计数。如果没有给出参数,它将等于 1,如果给出一个参数,它将等于 2。

        请注意,您不能使用 == 运算符比较 C 字符串。这是指针比较。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-08
          • 2021-10-15
          • 2021-06-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多