Разбор аргументов в C++
Во-первых, я знаю, что мой заголовок выглядит как часто задаваемый вопрос, но выслушайте меня. Когда я говорю "Разбор аргументов", я не имею в виду аргументы командной строки, которые передаются программе при запуске. Я пытаюсь создать отдельную систему, чтобы получать команды и анализировать их во время выполнения.
Главный:
int main(int argc, char *args[])
{
cout << "Started up." << endl;
reloop();
}
// Main execution point. Prints text to the console and moves to a void:
void reloop()
{
char *str;
cin >> str;
parseargs(str);
}
// Starts waiting for inputted data, if found, move onto parseargs void.
void parseargs(char *args)
{
char *strings[10];
char delim[] = " ";
int i = 0;
strings[i] = strtok(args,delim);
if(strings[0] == "try")
{
cout << "WORKED!" << endl;
reloop();
}
else
{
cout << "Na. Didn't work." << endl;
reloop();
}
}
// Takes the arguments passed to it, splits them via a space and passes them to an array. From here, compares the first entry in the array to a command. If they equal, output success note.
Теперь я довольно давно программист на C# и только начал C++. Что я делаю не так? Когда программа запускается, появляется ошибка:
Debug Assertion Failed!
Program: C:\Windows\system32\MSVCP110D.dll
File: c:\program files\microsoft visual studio 11.0\vc\include\istream
Line: 990
Expression: Invalid null pointer
* Примечание: у меня есть объявления для каждой функции в верхней части файла CPP.
4 ответа
Одна ошибка, которую я могу найти в вашем коде, в функции void reloop()
char *str;
cin >> str; <---"Undefined behavior"
Вы не выделяете память для str
,
исправьте это либо:
char str[SIZE];
- Динамически распределять пространство:
char* str = new char[SIZE];
Следующая ошибка:
if(strings[0] == "try")
должно быть:
if(strcmp( strings[0], "try")!=0)
void reloop() {
char *str; /* WRONG */
cin >> str;
parseargs(str);
}
Вы должны были написать это так:
void reloop() {
char str[BUF_MAX]; /* ok but take care of buffer overflow; maybe use std::string */
cin >> str;
parseargs(str);
}
Даже если вы знаете C#, обратите внимание, что вы ничего не знаете о C++ и что даже если вы очень умны, интуиция укажет вам неправильный путь (на самом деле, особенно если вы очень умны: C++ во многих аспектах действительно "нелогично", поэтому логический ум вообще не поможет).
Причина в том, что C++ такой, какой он есть по ряду сложных причин, включая эффект комитета и большое историческое наследие. Неважно, насколько вы умны, вы не будете угадывать ни историю, ни решение комитета.
Как char *
Часть C++ - это одна из этих вещей, которую можно понять, только если вы знаете историю (особенно историю C). Ошибка в вашей программе в том, что вы не можете написать
char *str;
cin >> str;
потому что ты не выделил память для этого. Это также был бы плохой код, потому что потенциально переполняет память, которую вы выделяете. Если вам не хватает этого, то вы пропустите МНОГО других, гораздо более тонких моментов программирования на C++.
Сделайте себе одолжение и начните с прочтения хорошей обложки на C++ вместо того, чтобы просто экспериментировать с компилятором.
Эксперимент не является разумным путем с C++ из-за его очень сложной и иногда нелогичной структуры и из-за "неопределенного поведения", что означает, что при совершении ошибки вы не можете рассчитывать на ясное сообщение об ошибке, но вместо этого можете получить сумасшедшее поведение (включая наиболее опасное). сумасшедшее поведение... т.е. код, очевидно, будет работать в любом случае, даже если присутствует ошибка).
Ваша проблема с кодом была объяснена другими.
Есть еще одна общая проблема с вашим кодом: вы не используете существующие функции или библиотеки, которые будут делать то, что вам нужно.
Решение Pure C: http://www.gnu.org/software/libc/manual/html_node/Getopt.html
Параметры программы C++ Boost: http://www.boost.org/doc/libs/1_54_0/doc/html/program_options.html