3
//Checks if an argument was specified
if (argv[1] != "")
    strcpy(Buff1, argv[1]);
else
    strcpy(Buff1, "default");

如果我运行: ./program test

Buff1 = 测试

如果我运行: ./program

Buff1 = PACKAGES/=包

如果未指定任何内容,我该如何制作,默认情况下 Buff1 将是“默认”?

4

5 回答 5

2

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

于 2013-06-09T07:53:17.323 回答
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], when 时argc=1,您实际上将数组越界。由于c++不会为您进行任何边界检查,因此有时您的程序可能会在静默访问 argv[0] 旁边的内存地址时失败。另一个问题是您正在尝试将字符串与!=运算符进行比较。您不能立即使用==/!=运算符比较字符串文字。您必须使用strcmp或等效功能。

于 2013-06-09T07:53:18.200 回答
1

好的,如果没有传递任何内容,则 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 的一种更高级的方法。

于 2013-06-09T08:02:37.270 回答
1

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

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

于 2013-06-09T07:52:30.220 回答
-2

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

于 2020-03-09T07:11:57.433 回答