C++控制台程序接收、解析参数及被如何调用、调试

时间:2022-07-22
本文章向大家介绍C++控制台程序接收、解析参数及被如何调用、调试,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

说明:本次不使用Qt内容,完全使用c++标准来写

一、控制台程序接收、解析参数

无论控制台程序也好、还是界面应用程序也好,C++的入口函数就是main函数,所有的执行第一个入口函数。 在main函数的入参中会带有两个入参

int main(int nArgc, char *argv[])

第一个参数:数组的大小,也就是携带参数的个数 第二个参数:程序执行接收到的参数 当执行程序没有携带任何参数的时候,参数列表默认有一个参数,就是本程序*.exe的所在路径。

参数.png

如果你准备让这个程序能接收命令参数的方式执行业务逻辑,那么只需要加上对参数的解析就好了。

接下来实现一个{ConsoleCMD.exe -r(read) D://CMDText.txt -w(write) D://CMDText2.txt} 这样命令的例子

1、首先缓存参数

vector<string> argvList;
for (int i = 0; i < nArgc; ++i)
{
    argvList.push_back(argv[i]);
}

当然你也可以使用别的方式,比如说直接按照参数顺序赋值给结构体或者类成员。不用再次循环去获取了;

2、解析参数

最简单的解析,你也可以根据你自身的业务情况来封装解析 比如读取的文件格式的解析与校验,支持 “-help” “-version” 以及 -r -w 解析空白字符等等

bool checkPath(const string& strFile)
{
    LPWIN32_FIND_DATAA FindFileData = new _WIN32_FIND_DATAA();
    HANDLE hFind = 0;

    LPCSTR text = strFile.c_str();

    hFind = FindFirstFileA(text, FindFileData);

    if (hFind == INVALID_HANDLE_VALUE)
    {
        delete FindFileData;
        return false;
    }

    delete FindFileData;
    return true;
}

bool parseParam(const vector<string>& argvList)
{
    //这里假定只接受5个参数
    int nSize = argvList.size();
    if ((1 < nSize && nSize != 5) || nSize > 5)
    {
        cout << "参数个数输入错误!" << endl;
        return false;
    }

    //解析第二个参数
    if ("-r" != argvList[1] && "-R" != argvList[1])
    {
        return false;
    }

    if (!checkPath(argvList[2]))
    {
        cout << "找不到" << argvList[2] << "该路径下的文件!" << endl;
        return false;
    }

    if ("-w" != argvList[3] && "-W" != argvList[3])
    {
        return false;
    }

    //最后一个参数为写入文件,可以不做解析,当文件不存在的时候进行默认的创建
    return true;
}

3、控制台命令main代码

int main(int nArgc, char* argv[])
{
    if (1 < nArgc)//当执行程序输入了参数
    {
        vector<string> argvList;

        for (int i = 0; i < nArgc; ++i)
        {
            argvList.push_back(argv[i]);
        }

        if (!parseParam(argvList))
        {
            cout << "参数输入错误!" << endl;
            return -1;
        }

        //执行任务
    }

    //没参数输入的处理.....
    return 0;
}

4、头文件

#include <iostream>
#include <vector>
#include <windows.h>
#include <string>

二、控制台程序的调用、调试

1、控制台调用

ConsoleCMD.exe的目录下,“shift+右键”,选择“在此处打开命令窗口” 输入命令:ConsoleCMD.exe -r D://CMDText.txt -w D://CMDText2.txt

命令执行.png

2、代码调用

#include <string.h>
using namespace std;

int main()
{
    string strCMD = "E://work//c++_Project//ConsoleCMD//Debug//ConsoleCMD.exe";
    string strParam = " -r D://CMDText.txt -w D://CMDText2.txt";//注意参数间的空格

    strCMD += strParam;

    system(strCMD.c_str());
}

3、调试控制台程序

在写一些较为复杂的参数的时候,难免会需要进行调试,那么怎么快速进入调试呢? 可以单步调试、可以打日志调试 我的方式是中断、附加进行调试

MessageBox(nullptr, L"test", L"test", 0);

在main函数开始的时候,直接弹出一个对话框,中断当前进程 然后在vs的调试菜单内找到“附加到进程”,打开后选择控制台进程进行调试。

附加进程.png

断点已中断

中断.png

三、其他获取命令的方法

int nArgc = 0;
LPWSTR* argv = nullptr;
LPWSTR pCmdLineW = GetCommandLineW();
argv = CommandLineToArgvW(pCmdLineW, &nArgc);