解析c++命令行参数

Parsing C++ Command-Line Arguments

本文关键字:参数 命令行 c++ 解析      更新时间:2023-10-16

是否有办法做到这一点?如果我有这样的输入:test "1"2 3,那么我想要argv[0]=test, argv[1]=1, argv[2]=2, argv[3]=3。但我有argv[1]=12argv[2]=3

去掉引号,用

调用程序
./test 1 2 3

在argv[1]、argv[2]和argv[3]中分别可以找到1、2、3

必须在" 2 "之后和之前使用空格,因为空格是参数分隔符

关于文字问题,

有办法做到这一点吗?如果我有这样的输入:test "1"2 3,那么我想要argv[0]=test, argv[1]=1, argv[2]=2, argv[3]=3

从技术上讲,在任何shell和OS组合中都可以将引号传递给进程。

这尤其包括Windows。

// Windows-specific code.
#undef UNICODE
#define UNICODE
#include <windows.h>
#include <iostream>
#include <memory>
auto wide_main( int argc, wchar_t const* const* const argv )
    -> int
{
    using std::wcout; using std::endl;
    wcout << "[" << ::GetCommandLine() << "]" << endl;  
    wcout << argc << " command line argument(s):" << endl;
    for( int i = 0; i < argc; ++i )
    {
        wcout << "  " << i << ": [" << argv[i] << "]" << endl;
    }
    return 0;
}
static void local_free( wchar_t** p ) { ::LocalFree( p ); }
auto main()
    -> int
{
    using std::unique_ptr;
    int n_args = 0;
    wchar_t** const raw_p_args = ::CommandLineToArgvW(
        ::GetCommandLine(), &n_args
        );
    if( raw_p_args == nullptr ) { return E_FAIL; }
    try
    {
        unique_ptr<wchar_t*, void(*)(wchar_t**)> const p_args(
            raw_p_args, &local_free
            );
        return wide_main( n_args, raw_p_args );
    }
    catch( ... )
    {
        throw;
    }
}

示例测试:<>之前[H: 0112年测试 开发]比;foo 1 "2"3[foo 1 "2"3] ←您可以访问引号。三个命令行参数:0 (foo):1: [1]2: [23][H: 0112年测试 开发]比;_之前因此,从技术上讲,在Windows中,使用标准的Windows命令解释器之一,您需要做的就是实现您自己的命令行解析

然而,这是一个太大的话题,不能在回答中讨论。

实际的结果是,只需调用您的程序像foo 1 2 3而不是foo 1 "2"3