main函数中参数argc和argv用法解析

1 基础

argcargument count 的缩写,表示传入main函数的参数个数;

argvargument vector 的缩写,表示传入main函数的参数序列或指针,并且第一个参数argv[0]一定是程序的名称,并且包含了程序所在的完整路径 ,所以确切的说需要我们输入的main函数的参数个数应该是argc-1个;

argv指向指针的指针main函数的第二个参数**char *argv[]也可以替换为 char **argv**,两者是等价的。

2 代码示例

简单用法示例,新建工程键代码:

cpp 复制代码
//main.cpp
#include <iostream>
using namespace std;
 
int main(int argc,char *argv[])
{
	cout<<argc<<endl;
	for(int i=0;i<argc;i++)
	{
		cout<<"argument["<<i<<"] is: "<<argv[i]<<endl;
	}
	return 0;
}

在编译环境下按F5运行,输出如下:

可见,在没有参数传入的情况下,保存程序名称的第一个变量argv[0]依然存在,并且是程序的路径。

在Windows端的VS中也是一样,

3 传参示例

3.1 Visual Studio (VS) 设置

有两种传递参数给 main 函数的方法。第一种方式是通过在编译环境中进行设置。在 Visual Studio 中,右击项目 -> 属性 -> 配置属性 -> 调试 -> 命令参数,然后在命令参数框中输入参数,每个参数之间用空格隔开。

点击确定后并应用,窗口中显示如下:

3.2 命令行

第二种方式也是经常会用到的方式是通过命令提示符传入。

3.2.1 Ubuntu

3个字符串(以间隔为界,不含间隔,这是约定)

3.2.2 PC

在打开命令提示符窗口(cmd)后,您可以输入生成的exe文件的完整路径。为了更方便,您可以直接将exe文件拖放到命令提示符窗口中,然后输入传入参数,用空格进行分隔。完成后按下回车键,系统将显示如下信息:

4 OPENCV示例

使用opencv显示一幅图片:

cpp 复制代码
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(int argc, char** argv)
{
    // 检查命令行参数
    if (argc < 2) {
        cerr << "Usage: " << argv[0] << " <image_path>" << endl;
        return -1;
    }

    // 读取图像
    const string imagePath = argv[1];
    Mat image = imread(imagePath);
    
    // 检查图像是否成功加载
    if (image.empty()) {
        cerr << "Error: Unable to load image from " << imagePath << endl;
        return -1;
    }

    // 显示图像
    imshow("Image", image);
    waitKey();

    return 0;
}

注意读入的参数是argv[1](因为0是程序的地址),在命令提示符窗口运行:

图片将会作为第2个传入参数传入到程序中执行。

5 补充

PS:通常情况下,编译器会默认使用argc和argv两个名称作为main函数的参数。然而,这两个参数并非强制,你可以选择任何符合C++语言命名规范的变量名作为入参,其效果是相同的。

cpp 复制代码
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>

using namespace std;
using namespace cv;

int main(int argc, char *argv[]) {
    for (int i = 0; i < argc; i++) {
        cout << "argument[" << i << "] is: " << argv[i] << endl;
    }

    cin.get(); // Wait for user input
    return 0;
}
相关推荐
cooldream200916 分钟前
当代 C++ 的三大技术支柱:资源管理、泛型编程与模块化体系的成熟演进
开发语言·c++
Queenie_Charlie37 分钟前
数字去重(set)
数据结构·c++·set
Ayanami_Reii1 小时前
区间不同数的个数-树状数组/线段树/莫队/主席树
数据结构·c++·算法·线段树·树状数组·主席树·莫队
大筒木老辈子1 小时前
C++笔记---并发支持库(atomic)
java·c++·笔记
zero_hz2 小时前
核心区分:用户态/内核态切换 vs. 程序阻塞
c++·io·内核态用户态
胡萝卜3.02 小时前
深入C++可调用对象:从function包装到bind参数适配的技术实现
开发语言·c++·人工智能·机器学习·bind·function·包装器
看见繁华2 小时前
C++ 高级
开发语言·c++
点云SLAM2 小时前
constexpr 和 explicit 在 C++ 中被提出的动机
开发语言·c++·explicit关键字·隐式转换·constexpr关键字·c++11/17/20
冷崖2 小时前
工厂模式-创建型
c++·设计模式
qq_310658512 小时前
mediasoup源码走读(六)——NetEQ
服务器·c++·音视频