#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 начинаются с 02. Как говорится, в программировании есть три большие проблемы: присвоение имен вещам и ошибки 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) и его определенно не следует разыменовывать.