//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
为您提供传递给程序的参数数量。请记住,argc
不能小于 1,因为argv[0]
它始终是程序的名称,因此如果没有传递参数,您应该使用它if(argc == 1){}
用于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
或等效功能。
好的,如果没有传递任何内容,则 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 的一种更高级的方法。
用于argc
确定参数计数。如果没有给出参数,它将等于 1,如果给出一个参数,它将等于 2。
请注意,您不能使用==
运算符比较 C 字符串。这是指针比较。
建议:使用 argv.size() 来获取计数。