#include <iostream>
int main(int argc, char** argv) {
std::cout << "Have " << argc << " arguments:" << std::endl;
for (int i = 0; i < argc; ++i) {
std::cout << argv[i] << std::endl;
}
}
使用 ./test a1 b2 c3 运行它将输出
Have 4 arguments:
./test
a1
b2
c3
5
int main();
这是一个简单的声明 . 它不能采用任何命令行参数 .
int main(int argc, char* argv[]);
当程序必须使用命令行参数时,将使用此声明 . 当像这样运行时:
myprogram arg1 arg2 arg3
argc 或Argument Count将设置为4(四个参数), argv 或Argument Vectors将填充字符串指针"myprogram","arg1","arg2"和"arg3" . The program invocation (myprogram) is included in the arguments!
8 回答
argc
是从命令行传递到程序中的参数数量,argv
是参数数组 .你可以通过参数循环知道它们的数量,如:
假设您运行程序(使用
sh
语法):如果您将main声明为
int main(int argc, char *argv[])
,那么(在大多数环境中),您的main()
将被调用,如同:但是,如果您将main声明为
int main()
,则会调用它并且你没有得到传递的参数 .
还有两点需要注意:
这是
main
的唯一两个标准强制签名 . 如果特定平台接受额外的参数或不同的返回类型,那么这是一个扩展,不应该依赖于可移植程序 .*argv[]
和**argv
完全等效,因此您可以将int main(int argc, char *argv[])
写为int main(int argc, char **argv)
.第一个参数是提供的参数数量,第二个参数是表示这些参数的字符串列表 .
main
函数可以有两个参数,argc
和argv
.argc
是一个整数(int
)参数,它是传递给程序的参数数量 .程序名称始终是第一个参数,因此程序至少会有一个参数,
argc
的最小值将为1 . 但是如果程序本身有两个参数,则argc
的值将为3 .参数
argv
指向字符串数组,称为 argument vector . 它是函数参数的一维字符串数组 .main
的参数表示程序启动时提供给程序的命令行参数 .argc
参数表示命令行参数的数量,char *argv[]
是表示命令行上提供的各个参数的字符串数组(字符指针) .两者的
是C或C程序入口点的合法定义 . Stroustrup: C++ Style and Technique FAQ详细介绍了主要功能可能或合法的一些变体 .
argv
和argc
是命令行参数如何传递给C和C中的main()
.argc
将是argv
指向的字符串数 . 这将(实际上)为1加上参数的数量,因为几乎所有实现都会将程序的名称添加到数组中 .按惯例,变量名为
argc
(参数计数)和argv
(参数向量),但它们可以被赋予任何有效的标识符:int main(int num_args, char** arg_strings)
同样有效 .如果您不打算处理命令行参数,它们也可以完全省略,产生
int main()
.尝试以下程序:
使用
./test a1 b2 c3
运行它将输出这是一个简单的声明 . 它不能采用任何命令行参数 .
当程序必须使用命令行参数时,将使用此声明 . 当像这样运行时:
argc
或Argument Count将设置为4(四个参数),argv
或Argument Vectors将填充字符串指针"myprogram","arg1","arg2"和"arg3" . The program invocation (myprogram) is included in the arguments!或者,您可以使用:
这也是有效的 .
您可以添加另一个参数:
envp
参数还包含环境变量 . 每个条目都遵循以下格式:像这样:
环境变量列表以空值终止 .
IMPORTANT: 在
system()
的调用中不要直接使用任何argv
或envp
值!这是一个巨大的安全漏洞,因为恶意用户可以将环境变量设置为命令行命令并(可能)造成大量破坏 . 一般来说,只是不要使用system()
. 通过C库几乎总能有更好的解决方案 .