如果我不给它命令行参数,为什么程序会崩溃?

时间:2013-01-18 17:47:42

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

我制作了一个简单的测试程序来使用C ++ 11线程。

#include <iostream>
#include <stdlib.h>
#include <thread>
using namespace std;

void tee(int civ)
{
    for(int loop=0; loop<19; loop++, civ++)
    {
        civ = civ%19;
        cout << loop << "\t" << civ << endl;
        this_thread::sleep_for(chrono::milliseconds(300));
    }
}

void koot()
{
    while(true)
    {
        cout << ":) ";
        this_thread::sleep_for(chrono::milliseconds(300));
    }
}

int main(int argc, char *argv[])
{
    thread saie(tee, atoi(argv[1])),
        kamaa(koot);
    saie.join();
    kamaa.join();

    return 0;
}

只要我提供命令行参数,它就能正常工作,但如果我不提供,它会崩溃。 怎么解决这个问题? 我尝试检查参数计数,如果它们存在,则无济于事。

编辑:我必须添加这一行:

if(argc < 2) return 1;

4 个答案:

答案 0 :(得分:7)

因为您正在访问

而崩溃
argv[1]

如果有的话,它将保存命令行参数(程序名称除外)。您应该检查argc是否大于1.为什么大于1?因为第一个命令行参数是程序本身的名称。因此argc始终大于0。索引从0开始。因此,如果argc == 1,则只有argv[0]有效。

#include <iostream>
int main(int argc, char* argv[])
{
  // no need to check argc for argv[0]
  std::cout << argc << " " << argv[0] << "\n";
}

答案 1 :(得分:4)

argv[1]为空,导致对atoi()的调用崩溃。请注意,C ++中的数组索引是从零开始的!

答案 2 :(得分:3)

因为您没有检查是否argc > 1并且您尝试访问argv[1]

解决这个问题的方法是首先检查argc > 1是否然后访问argv [1]。

int main(int argc, char *argv[])
{

    if(argc > 1){
    thread saie(tee, atoi(argv[1])),
        kamaa(koot);
    saie.join();
    kamaa.join();
   }
    return 0;
}

要记住的要点:

  1. argc默认为1.这是包含no的参数计数器。传递给程序的参数。默认情况下,它为1,因为程序获取可执行文件的名称(和路径)

  2. argv包含NULL终止的字符数组(或字符串)数组。 argv[0]将始终保留可执行文件的名称。

  3. 永远不会假设用户总是输入参数。并且在将来访问argv或任何数组时始终进行边界检查。

答案 3 :(得分:2)

请尝试使用以下代码:

int main(int argc, char *argv[])
{
    if(argc < 2) {   cout<<"No command line arguments found\n Aborting!\n"; return 1;}
    else         {   thread saie(tee, atoi(argv[1])),kamaa(koot);}
    saie.join();
    kamaa.join();

    return 0;
}

您正在尝试访问不存在的命令行参数argv [1]。最好检查命令行参数是否存在。