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);
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容

  • 运行操作 CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本、文件系统版本) CM...
    小明yz阅读 2,760评论 0 8
  • 命令简介 cmd是command的缩写.即命令行 。 虽然随着计算机产业的发展,Windows 操作系统的应用越来...
    Littleston阅读 3,317评论 0 12
  • 运行操作 CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本、文件系统版本) CM...
    小沐子_IT阅读 2,115评论 0 4
  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,753评论 0 8
  • win7 cmd管理员权限设置 net localgroup administrators 用户名 /add 把“...
    f675b1a02698阅读 5,187评论 0 11