如何在C++中解析命令行参数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在C++中解析命令行参数相关的知识,希望对你有一定的参考价值。
C++内的命令行参数储存在main函数中的argv参数中 而argc储存了命令行参数个数 由系统在执行时动态分配
实例:
#include <cstdio>/*
* argc:命令行参数个数
* argv:储存了所有命令行参数,其中第一个(即argv[0])为当前可执行文件名
*/
int main(int argc,char *argv[])
int i;
for(i=0;i<argc;i++)
if(argv[i]=="test")
puts("Found argument 'test'");
return 0;
参考技术A 建议使用boost::program_options
#include <algorithm>
char* getCmdOption(char ** begin, char ** end, const std::string & option)
char ** itr = std::find(begin, end, option);
if (itr != end && ++itr != end)
return *itr;
return 0;
bool cmdOptionExists(char** begin, char** end, const std::string& option)
return std::find(begin, end, option) != end;
int main(int argc, char * argv[])
if(cmdOptionExists(argv, argv+argc, "-h"))
// Do stuff
char * filename = getCmdOption(argv, argv + argc, "-f");
if (filename)
// Do interesting things
// ...
return 0;
在使用这种方法时,必须使用std::string作为std::find的值
class InputParser
public:
InputParser (int &argc, char **argv)
for (int i=1; i < argc; ++i)
this->tokens.push_back(std::string(argv[i]));
/// @author iain
const std::string& getCmdOption(const std::string &option) const
std::vector<std::string>::const_iterator itr;
itr = std::find(this->tokens.begin(), this->tokens.end(), option);
if (itr != this->tokens.end() && ++itr != this->tokens.end())
return *itr;
static const std::string empty_string("");
return empty_string;
/// @author iain
bool cmdOptionExists(const std::string &option) const
return std::find(this->tokens.begin(), this->tokens.end(), option)
!= this->tokens.end();
private:
std::vector <std::string> tokens;
;
int main(int argc, char **argv)
InputParser input(argc, argv);
if(input.cmdOptionExists("-h"))
// Do stuff
const std::string &filename = input.getCmdOption("-f");
if (!filename.empty())
// Do interesting things ...
return 0;
MFC C++ 应用程序:如何在任务管理器中清除命令行参数?
【中文标题】MFC C++ 应用程序:如何在任务管理器中清除命令行参数?【英文标题】:MFC C++ application: how to clear command line arguments in Task Manager? 【发布时间】:2020-08-03 07:44:24 【问题描述】:我有一个使用命令行参数的 MFC C++ 应用程序。 但是当程序运行时,在命令行输入的敏感信息会显示在任务管理器的命令行栏中。 1.那么如何删除它们? 2.MFC C++中如何修改命令行参数?
非常感谢。
【问题讨论】:
我的应用是 x32 【参考方案1】:我在 x32 InitInstance 中使用了以下函数,但它不起作用。 Param.CommandLine.Buffer 已更改为空,因为任务管理器仍显示命令行。 有错吗?
#include <Windows.h>
#include <Winternl.h>
#include <stdio.h>
#include <tchar.h>
typedef NTSTATUS (NTAPI *PFN_NT_QUERY_INFORMATION_PROCESS) (
IN HANDLE ProcessHandle,
IN PROCESSINFOCLASS ProcessInformationClass,
OUT PVOID ProcessInformation,
IN ULONG ProcessInformationLength,
OUT PULONG ReturnLength OPTIONAL);
void ClearCommandLine()
HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS,
FALSE, GetCurrentProcessId());
PROCESS_BASIC_INFORMATION pbi = 0;
RTL_USER_PROCESS_PARAMETERS Param = 0;
PFN_NT_QUERY_INFORMATION_PROCESS pfnNtQueryInformationProcess =
(PFN_NT_QUERY_INFORMATION_PROCESS) GetProcAddress (
GetModuleHandle(TEXT("ntdll.dll")), "NtQueryInformationProcess");
NTSTATUS status = pfnNtQueryInformationProcess (
hProcess, ProcessBasicInformation,
(PVOID)&pbi, sizeof(pbi), NULL);
wchar_t* lpwszCmd=L"";
USHORT usCmdLen = 2 + 2 * (wcslen(lpwszCmd));
ReadProcessMemory(hProcess, pbi.PebBaseAddress, &peb, sizeof(peb), NULL);
ReadProcessMemory(hProcess, peb.ProcessParameters, &Param, sizeof(Param), NULL);
WriteProcessMemory(hProcess, Param.CommandLine.Buffer, lpwszCmd, usCmdLen,NULL);
WriteProcessMemory(hProcess,&Param.CommandLine.Length, &usCmdLen, sizeof(usCmdLen), NULL);
CloseHandle(hProcess);
【讨论】:
以上是关于如何在C++中解析命令行参数的主要内容,如果未能解决你的问题,请参考以下文章