C std :: logic_error внутри цикла for с использованием argv

#c

#c

Вопрос:

Я новичок в C и пытаюсь написать программу, которая будет принимать аргументы командной строки и создавать файл .desktop. Я пытаюсь реализовать идентификацию значений argv, но я продолжаю получать std:: logic_error

Мой код:

 #include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string>

using namespace std;

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

    string name;
    string comment;

    for(int i = 1; i <= argc; i  ) {
        char* tmp[] = {argv[i]};
        string param = *tmp;
        string paramVal = argv[i 1];
        if(param == "-h") {
            cout << "-h        Display this help dialogue" << endl;
            cout << "-n        Set entry name" << endl;
            cout << "-c        Set entry comment" << endl;
            cout << "-e        Set entry executable path" << endl;
            cout << "-i        Set entry icon" << endl;
            break;
        }
        else if(param == "-n") {
            name = paramVal;
            i  ;
            continue;
        }
        else if(param == "-c") {
            comment = paramVal;
            i  ;
            continue;
        }
        else if(param == "-e") {

        }
        else if(param == "-i") {

        }
        else {
            cout << "ERROR >>> Unrecognised parameter %s" << param << endl;
        }
    }

    cout << "Name: %snComment: %s" << name << comment << endl;
    return(0);
}
  

Программа отлично компилируется (с использованием g ), но при попытке запуска ./createDesktopIcon -n a -c b я получаю следующую ошибку

 terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_M_construct null not valid
Aborted
  

Пожалуйста, помогите, так как это очень расстраивает

Комментарии:

1. Голосование за закрытие из-за опечатки. У вас ошибка off из-за одной ошибки. i <= argc; должно быть i < argc; . Помните, что индексы в C начинаются с 0

2. Как говорится, в программировании есть три большие проблемы: присвоение имен вещам и ошибки off by one.

3. Почему обходной путь через tmp вместо string param = argv[i]; ? Было ли это попыткой устранить проблему?

Ответ №1:

Вот проблемы, которые я вижу:

 i <= argc
  

Вы хотите сравнить, i < argc потому что argv[argc] элемент в массиве на самом деле является одним из последних элементов в argv массиве.

Кроме того, здесь:

 string paramVal = argv[i 1];
  

Это также приведет к доступу к массиву за пределами.

Возможно, вы захотите взглянуть на getopt, чтобы сделать все это за вас.

Комментарии:

1. Я полагаю, что argc[argc] это не за пределами массива, но это будет nullptr (как токен sentinel) и его определенно не следует разыменовывать.