解析C ++命令行参数

时间:2014-06-07 10:25:25

标签: c++ argv

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

3 个答案:

答案 0 :(得分:3)

只需删除引文并使用

调用程序即可
./test 1 2 3

您将分别在argv [1],argv [2]和argv [3]中找到1,2,3。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

关于字面问题,

  

有没有办法做到这一点?如果我有这样的输入:test "1"2 3那么我想要argv[0]=testargv[1]=1argv[2]=2argv[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:\dev\test\0112]
> foo 1 "2"3
[foo  1 "2"3]                      ← You have access to the quotes.
3 command line argument(s):
  0: [foo]
  1: [1]
  2: [23]

[H:\dev\test\0112]
> _

从技术上讲,在Windows中,使用标准Windows命令解释器之一,您需要做的就是实现自己的命令行解析

然而,在答案中要处理的话题太大了。

实际结果是,只需调用foo 1 2 3而不是foo 1 "2"3等程序。

相关问题