如何在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++中解析命令行参数的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中解析命令行参数? [关闭]

C++,命令行参数未正确解析

如何在 C++ 程序中使用命令行参数?

MFC C++ 应用程序:如何在任务管理器中清除命令行参数?

如何解析命令行参数?

C++解析命令行参数(仿C语言args)