Программа не закрывается при выполнении условий выхода?

0

Я работаю над проектом оболочки в c++. Вся необходимая функциональность есть. Однако есть одна проблема. Мое условие выхода - это когда пользователь вводит "exit", который отлично работает, если предыдущая команда не является случайной строкой (например: asldjkf). Когда вводится случайная строка, а затем вывод выполняется в следующем приглашении, он снова циклытся, а затем выходит, когда пользователь снова вводит "exit".

Я только что отлаживал использование cout, и я знаю, что условия для выхода выполняются. Может кто-нибудь сказать мне, что здесь может быть?

вот то, что я вызываю в main()

UNIX_shell myShell;
char * args[100];

string check = "";           
argsIndex = 0;              

string userIn;
while(myShell.exitstatus == false)
{
    std::cin.getline(myShell.userIn, 256);   
    check = string(myShell.userIn);
    cout << check << endl;

    myShell.getArgs(check, args);
    if(myShell.exitstatus == false && string(myShell.userIn) != "exit")
        cout << myShell.userName + "@" + myShell.hostName + ":~" + getcwd(NULL, 0) + "/";
}

return 0;

и вот где условие выхода выполняется сразу после вызова getArgs():

void UNIX_shell::getArgs(string check, char * args[])
{
    cout << "check is" << check << endl;

    if(check[0] == 'e' && check[1] == 'x' && check[2] == 'i' && check[3] == 't')
    { 
        cout << "shadoom" << endl;
        this->exitstatus = true;
        cout << "exit = "<< exitstatus << endl;
        return;
    }

...

Поэтому, если я запускаю свою программу и вводю что-то вроде ls или ps -aef, а затем введите exit, все будет работать нормально, и программа выйдет.

Но если я запустил свою программу, введите "shit" в командной строке, а затем введите "exit" в следующем приглашении, я получу второе приглашение, а затем, когда я снова нахожу exit, он завершает работу. Я пытался отладить это более часа. Спасибо за любую помощь заранее.

  • 2
    stackoverflow.com/help/mcve
  • 2
    Ваш код не выглядит так, как будто он на самом деле компилируется - вы просто копировали и вставляли различные фрагменты, которые принадлежат друг другу, но на самом деле это не программа? Вы, кажется, смешиваете std::string с char * способами, которые не должны быть необходимыми ... Что может быть или не быть проблемой.
Показать ещё 4 комментария
Теги:

1 ответ

1
Лучший ответ

Как было предложено Матс, предпочтительнее избегать символа char * и придерживаться строк.

Вот пример кода, делающий то же самое, что и вы, и используя строки.

Следующая функция будет разделять строку на каждом символе delim (например, пробелы) и заполнять элемы результирующими частями. Я получил его здесь qaru.site/questions/63/....

std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) 
{
    elems.clear();
    std::stringstream ss(s);
    std::string item;
    while(std::getline(ss, item, delim)) 
        elems.push_back(item);
    return elems;
}

Это будет ваш основной цикл кода по входным строкам, предоставленным пользователем.

std::string inputStr;
std::vector<std::string> args;

for(;;)
{
    std::getline(std::cin, inputStr);
    if(inputStr == "exit")
       break;
    split(inputStr, ' ', args);
    ...
}
  • 0
    Спасибо за вклад, я ценю это. Я думаю, что мне придется оставить то, что у меня здесь, к сожалению, и принять это как урок. В основной части кода (здесь явно не опубликовано) я использую istringstream для передачи строк в аргументы. Книга, из которой идет этот проект, привела примеры с использованием char *, поэтому изначально она была добавлена сюда.
  • 0
    Хорошо. Код, который вы показываете, кажется мне правильным. Проблема в другом.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню