Segmentation fault при разборе аргументов main() c++ [закрыто]

164
26 ноября 2016, 19:05

Здравствуйте. Мне нужно определить аргументы командной строки и исходя из полученых команд проделать некие действия. Запуская программу из параметрами разными параметрами я получаю сообщение Segmentation fault. Помогите понять, что я делаю неверно. Зарание извиняюсь за столь ужасный код.

int main(int argc, char* argv[]) {
    MySniffer snf;
    if(argc == 1 || argc == 3 || argc > 4) {
        cout << "Wrong options. Read program options.\n" << snf.usage_inf() << endl;
        exit(1);
    }
    for(int i = 1; i < argc; ++i) {
        if(strcmp(argv[i], "select") == 0) {
                cout << "hello" << endl;
            for(int j = i; j < argc; ++j){
                if(strcmp(argv[j], "iface") == 0){
                    string str = string(argv[3]);
                    snf.setIface(str);
                    snf.pkgMonitor(snf.get_cmd());
                }
            }       
        }
        if(strcmp(argv[i], "show") == 0) {
            for(int j = i; j < argc; ++j) {
                if(strcmp(argv[j], " count")){
                    if(snf.select_data(argv[2])==1){
                        cout << "There is no adress " << argv[2] << " or data base wasn't created.\n"
                        << "Check if you select network interface.\n";
                    }
                    snf.pkgMonitor(snf.get_cmd());
                }
            }
        }
        if(strcmp(argv[i], "--help") == 0) {
            for(int i = 0; i < argc; ++i)
                cout << argv[i] << endl;
            cout << snf.usage_inf() << endl;
            snf.pkgMonitor(snf.get_cmd());
        }
        if(strcmp(argv[i], "stop") == 0) {
            cout << "Packets are not sniffed.\n" << endl;
            snf.set_cmd(true);
        }
        if(strcmp(argv[i], "start") == 0){
            if(snf.isIfaceDeff()){
                cout << "Packets are being sniffed from now on\n" << endl;
            }
            else {
                cout << "You first need to select your interface. Read program options.\n" << snf.usage_inf() << endl;
            }
            snf.set_cmd(false);
            snf.pkgMonitor(snf.get_cmd());
        }
    }
    return 0;
}
Answer 1

У вас могут быть только argc==2 и argc==4, судя по строчке

if(argc == 1 || argc == 3 || argc > 4) {

Один из вопросов - что будет тут

if(strcmp(argv[j], "iface") == 0){
    string str = string(argv[3]);

при argc == 2?...

То же и с

if(snf.select_data(argv[2])==1){
    cout << "There is no adress " << argv[2] << " or data base wasn't created.\n"

И, кстати, в

if(strcmp(argv[i], "select") == 0) {
    cout << "hello" << endl;
    for(int j = i; j < argc; ++j){
        if(strcmp(argv[j], "iface") == 0){

какой смысл сравнивать с iface тот аргумент, который заведомо равен select - я имею в виду, начинать с int j = i?

READ ALSO
Не могу разобраться с vector &lt; unque_ptr &lt;T&gt;&gt;

Не могу разобраться с vector < unque_ptr <T>>

Есть класс, в котором есть поле вектора из unique_ptr (Animals - тоже класс), а так же методы чтения и записи в файл этого вектора классаВот фрагмент...

181
Как остановить демон?

Как остановить демон?

У меня никак не получается остановить работу демона, что я и пытаюсь сделать с помощью параметра stopПодскажите, как лучше это сделать? И почему...

328
Shlobj.h актуален? [закрыто]

Shlobj.h актуален? [закрыто]

Здравствуйте! Пишу простой проводник и столкнулся с такой библиотекойВопрос такой: для написания проводника ею лучше пользоваться? И для...

186
Динамическое обновление терминала ubuntu

Динамическое обновление терминала ubuntu

Я вывожу значение постоянно обновляемой переменной в терминал в виде:

193