Почему происходит сбой моей программы, если я не предоставляю ей аргументы командной строки?

Я сделал простую тестовую программу для работы с потоками 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;

-13

Решение

Это происходит сбой, потому что вы получаете доступ

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";
}
7

Другие решения

argv[1] является нулевым, вызывая сбой в вызове atoi(), Обратите внимание, что индексы массива в C ++ начинаются с нуля!

4

потому что вы не проверяете, если 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. Это счетчик аргументов, который содержит нет. аргументов, переданных в программу. По умолчанию его 1, потому что программа получает имя исполняемого файла (и путь)

  2. argv содержит массив NULL-символьных массивов (или строк) argv[0] всегда будет содержать имя исполняемого файла.

  3. никогда не предполагайте, что пользователь всегда будет вводить аргументы. и всегда делать проверку границ при доступе argv или любой массив в будущем.

3

Попробуйте вместо этого следующий код:

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], которого нет. Всегда лучше проверить, существует ли аргумент командной строки или нет.

2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector