Программа аварийно завершает работу после отправки EOFC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Программа аварийно завершает работу после отправки EOF

Сообщение Anonymous »

Я создаю базовый интерпретатор командной строки для поддержки 4 команд, команду можно ввести полностью в одну строку, например

Код: Выделить всё

wc -w "Hello World!" 
и это выведет 2, так как это команда подсчета слов, и все работает хорошо, однако мои команды можно ввести, введя только имя команды (и вариант, если он существует), а затем нажмите Enter, чтобы ввести аргумент в новой строке, например:

Код: Выделить всё

Hello World!
таким образом, после первого нажатия клавиши Enter мне нужно принимать входные данные (аргументы), пока строка не станет EOF. В целом это похоже на то, как будет работать настоящая командная строка, я почти уверен. Ошибка возникает именно в этом случае, при вводе аргумента таким образом, после нажатия EOF он выполняет функцию как надо, но автоматически вызывает следующую команду (потому что программа должна работать в бесконечном цикле), который пуст и, следовательно, приводит к сбою программы. Вот некоторые из моих функций

Код: Выделить всё

string Reader::readLine() {
cin.clear();
char line[maxLineLength];
cin.getline(line, maxLineLength);
return line;
}

Command* Parser::parseLine(const string& line) {
stringstream ss(line);
string word;
string words[3] = {"", "", ""};
size_t pos = line.find('"');
int hasQuote = 0;
if (pos != string::npos) {
hasQuote = 1;
}
for (int i = 0; i < 3; i++) {
if (ss >> word) {
words[i] = word;
}
else {
words[i] = "";
}
}
string function = words[0];
string opt, arg;
if (words[1].front() == '-' && !hasQuote) {
opt = words[1];
arg = words[2];
}
else if (words[1].front() == '"') {
opt = "";
arg = line.substr(pos, line.length());
}
else if (words[1].front() == '-' && hasQuote) {
opt = words[1];
arg = line.substr(pos, line.length());
}
else {
opt = "";
arg = words[1];
}
Command *res = nullptr;
if (function == "echo") {
if (arg.empty()) {
arg.clear();
string tmp;
while (getline(cin, tmp)){
arg += tmp + "\n";
}

cin.clear();
arg = "\"" + arg;
arg[arg.length() - 1] = '\"';
}

res = new EchoCommand(arg);
}
else if (function == "date") {
res = new DateCommand();
}
else if (function == "time") {
res = new TimeCommand();
}
else if (function == "touch") {
res = new TouchCommand(arg);
}
else if (function == "wc") {
res = new WcCommand(arg, opt);
}
else {
cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/79239778/program-crashes-after-eof-is-sent[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»