前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++控制台程序接收、解析参数及被如何调用、调试

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

作者头像
Sky_Mao
发布2020-07-24 10:16:54
1.9K0
发布2020-07-24 10:16:54
举报

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

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

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

代码语言:javascript
复制
int main(int nArgc, char *argv[])

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

参数.png

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

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

1、首先缓存参数
代码语言:javascript
复制
vector<string> argvList;
for (int i = 0; i < nArgc; ++i)
{
    argvList.push_back(argv[i]);
}

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

2、解析参数

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

代码语言:javascript
复制
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代码
代码语言:javascript
复制
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、头文件
代码语言:javascript
复制
#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、代码调用
代码语言:javascript
复制
#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、调试控制台程序

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

代码语言:javascript
复制
MessageBox(nullptr, L"test", L"test", 0);

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

附加进程.png

断点已中断

中断.png

三、其他获取命令的方法

代码语言:javascript
复制
int nArgc = 0;
LPWSTR* argv = nullptr;
LPWSTR pCmdLineW = GetCommandLineW();
argv = CommandLineToArgvW(pCmdLineW, &nArgc);
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、控制台程序接收、解析参数
    • 1、首先缓存参数
      • 2、解析参数
        • 3、控制台命令main代码
          • 4、头文件
          • 二、控制台程序的调用、调试
            • 1、控制台调用
              • 2、代码调用
                • 3、调试控制台程序
                • 三、其他获取命令的方法
                相关产品与服务
                命令行工具
                腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档