【问题标题】:Adding a -q switch to a list of arguments将 -q 开关添加到参数列表
【发布时间】:2013-07-06 08:53:53
【问题描述】:

我试图想办法为我的命令行参数添加一个可选的安静开关。我正在处理的程序是一个文本到 HTML 的转换器,并且至少需要包含一个文本源文件才能使程序运行。我想要得到的是,当用户在参数列表中的任何位置输入 -q 时,程序仍然会运行,但会抑制向控制台的输出。我尝试了一些 if 语句和循环,它们会将参数值重新分配给我的 infile 和 outfile 变量,但它们也不起作用。代码可以在这里找到:https://gist.github.com/anonymous/ab8ecfd09bddba0d4fcc。我对使用 C++ 还比较陌生,所以如果您能以简单的方式解释如何更接近我的目标,我将不胜感激。

【问题讨论】:

  • getopt 或类似的东西会有帮助吗?

标签: c++ command-line-arguments command-prompt


【解决方案1】:

我马上有什么东西跳出来了,你正在测试参数是否等于-q by

if( strcmp( argv[1], "-q" ) != 0) //This is an example of what I am trying to do.
{
    quiet = true;
    infile.open( argv[2] );
}

这是不正确的。 strcmp 返回比较的两个字符串之间的词法差异: http://www.cplusplus.com/reference/cstring/strcmp/

所以我相信你想要

if( strcmp( argv[1], "-q" ) == 0) //This is an example of what I am trying to do.
{
    quiet = true;
    infile.open( argv[2] );
}

就像我说的,我没有测试任何东西,它只是跳出来。

编辑

我将如何解析源文件、目标文件和 -q 选项

std::string sourceFile;
std::string destFile;

if ( argc == 3 )
{
    sourceFile = std::string( argv[1] );
    destFile = std::string( argv[2] );
}
else if ( argc == 4 )
{
    // quiet mode is enabled
    std::string arg1( argv[1] );
    std::string arg2( argv[2] );
    std::string arg3( argv[3] );

    if ( arg1 != "-q" )
        vec.push_back( std::string( arg1 );
    if ( arg2 != "-q" )
        vec.push_back( std::string( arg2 );
    if ( arg3 != "-q" )
        vec.push_back( std::string( arg3 );

    if ( vec.size() != 2 )
    {
        // maybe error? 
    }
    else
    {
        sourceFile = vec[0];
        destFile = vec[1];
    }
}

当然不是越干净越好,我还没有测试过,所以可能会有一个小错误。

【讨论】:

  • 啊,我相信我现在走在正确的轨道上,我不敢相信我错过了。我想我现在离工作更近了。谢谢。另一个问题,对于我的字符串 outfilename,是否可以根据输入 -q 开关的时间为其分配不同的命令行参数?有没有我可以用来将参数的 char* 分配给字符串的函数?
  • argv 的每个 char* 都是以空值结尾的,因此可以将其直接传递到 std::string 的构造函数中:std::string s( argv[2] ) 或您想要的任何 arg。你问的是这个吗?
  • 有点。我的意思是每次安静开关在参数列表中的不同位置时我是否必须重新创建字符串 outfilename 或者我可以通过执行 outfilename( argv[3] ) 来传递它吗?
  • 那么你是说当他们不提供 -q 选项时你应该怎么做?就个人而言,我希望 -q 选项位于 argv 的位置 1。如果它在那里,那么我知道源文件在位置 2,目标文件在位置 3,else 我知道源文件在位置 1,目标文件在位置 2。所以我会根据该逻辑读取所有内容,并且然后完成参数列表。
  • 向量是从哪里来的,它到底是做什么用的?只是为了将 C 风格的 args 转换为 C++ 字符串?还是为了别的?
猜你喜欢
  • 2016-10-27
  • 2015-02-14
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多