我制作了一个简单的测试程序来使用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;
答案 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;
}
要记住的要点:
argc
默认为1.这是包含no的参数计数器。传递给程序的参数。默认情况下,它为1,因为程序获取可执行文件的名称(和路径)
argv
包含NULL终止的字符数组(或字符串)数组。 argv[0]
将始终保留可执行文件的名称。
永远不会假设用户总是输入参数。并且在将来访问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]。最好检查命令行参数是否存在。