【问题标题】:How to process command line arguments?如何处理命令行参数?
【发布时间】:2013-05-04 22:50:38
【问题描述】:

昨天我用 C++ 编写了一个简单的程序,它使用通过命令行传递的参数。

E.G. myDrive:\myPath\myProgram.exe firstWord secondWord

程序运行良好,可以做它必须做的事情,但我有点好奇: 我必须先写argc --;才能很好地使用它,否则我会出现运行时崩溃[编译器不会说话!]。

尤其是argc,当我在运行程序时没有给出任何词作为参数时,这让我感到很糟糕......

现在它可以工作了,所以一点也不差,但我想知道为什么会这样! [附:制作argc --; 并打印它,它会将0 作为值!]

编辑: 这里所有使用argc的指令

int main(int argc, char *argv[]) {
    [...]
    argc --;
    if(argc > 0){
        if(firstArg.find_last_of(".txt") != string::npos){
            reading.open(argv[1], ios::binary);
            [...]
        }
    }
    if ((!(firstArg.find_last_of(".txt") != string::npos)) && argc > 0){
    [...]
        for(int i = 1; i <= argc; i ++){
        [...]
        toTranslate = argv[i][j];
        [...]
        toTranslate = argv[i][j];
        }
    }
}

【问题讨论】:

  • 你能展示一些演示问题的代码吗?
  • 我确定你写过类似i&lt;=argc 的东西。顺便给我们看一下代码。
  • 我编辑答案,请稍等!
  • 你在linux下吗? getopt?
  • 我在Windows 8下!

标签: c++ command-line-arguments


【解决方案1】:

参数包括程序本身的名称,所以argc总是至少为1。

这是典型的循环:

int main(int argc, char * argv[])
{
    for (int i = 0; i != argc; ++i)
    {
        std::cout << "Argument #" << i << ": " << argv[i] << "\n";
    }
}

您也可以向后打印:

while (argc--)
{
    std::cout << argv[argc] << "\n";
}

【讨论】:

  • 是的,但是即使我尝试使用cout &lt;&lt; argc 打印 argc 也会崩溃,并且只有在我减去它之前它才会崩溃!
  • @IngrossoD:只需在您发布的代码中使用i &lt; argc 而不是i &lt;= argc。 而且一开始就不要argc--!
  • @Nawaz:在 for 循环之前发生崩溃!我按你说的开始了!
  • @IngrossoD:在这种情况下,请评论所有内容,然后仅 cout &lt;&lt; argc。看看现在会不会崩溃。它没有,然后一次取消注释一个(或两个)语句,然后每次编译并运行。看看到底是哪一行导致了崩溃!
  • 谢谢朋友,我在问题中 [严重] 省略了 string firstArg 上的作业!此外,使用 Kerrek 方法一切都很好 [;
猜你喜欢
  • 2015-05-01
  • 1970-01-01
  • 2023-03-30
  • 2020-06-26
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多