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);
- hdu-------1081To The Max
- nyoj------170网络的可靠性
- HDUOJ-------1052Tian Ji -- The Horse Racing(田忌赛马)
- 初学Java之Pattern与Matcher类
- 初学java之StringBuffer类的常用方法
- 初学java之大数处理
- hdu---1024Max Sum Plus Plus(动态规划)
- Go语言异步服务器框架原理和实现
- nyoj------布线问题(kruscal+求最小值)
- nyoj-----127星际之门(一)
- nyoj------20吝啬的国度
- HDUOJ-------2493Timer(数学 2008北京现场赛H题)
- go sync.Mutex 设计思想与演化过程 (一)
- HDUOJ--------A simple stone game(尼姆博弈扩展)(2008北京现场赛A题)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- c++之普通函数和模板函数的区别
- 【python-leetcode15-双指针】三个数之和为零
- 百度easydl之图像分类构建是否佩戴口罩模型
- c++之普通函数和模板函数的调用规则
- 解决github打不开问题
- vuejs之第一个vue程序
- c++之函数模板的局限性
- c++之模板-类模板
- springboot监控之监控管理
- c++之类模板和函数模板的区别
- 【python-leetcode977-双指针】有序数组的平方
- springboot分布式之springcloud-Eureka注册中心
- c++之类模板成员函数创建时机
- vuejs之v-on小例子之实现购买数量的增加和减少
- c++之类模板对象作函数参数