Я сделал простую тестовую программу для работы с потоками 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;
Это происходит сбой, потому что вы получаете доступ
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";
}
argv[1]
является нулевым, вызывая сбой в вызове atoi()
, Обратите внимание, что индексы массива в C ++ начинаются с нуля!
потому что вы не проверяете, если 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. Это счетчик аргументов, который содержит нет. аргументов, переданных в программу. По умолчанию его 1, потому что программа получает имя исполняемого файла (и путь)
argv
содержит массив NULL-символьных массивов (или строк) argv[0]
всегда будет содержать имя исполняемого файла.
никогда не предполагайте, что пользователь всегда будет вводить аргументы. и всегда делать проверку границ при доступе argv
или любой массив в будущем.
Попробуйте вместо этого следующий код:
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], которого нет. Всегда лучше проверить, существует ли аргумент командной строки или нет.