Я работаю над проектом оболочки в 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, он завершает работу. Я пытался отладить это более часа. Спасибо за любую помощь заранее.
Как было предложено Матс, предпочтительнее избегать символа 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);
...
}
std::string
сchar *
способами, которые не должны быть необходимыми ... Что может быть или не быть проблемой.