退出条件满足时程序不退出?

时间:2015-02-24 08:06:09

标签: c++ shell unix

我正在使用c ++开发一个shell项目。我需要的所有功能都在那里。然而,有一个问题。我的退出条件是当用户输入"退出"时,除非前一个命令是随机字符串(例如:asldjkf),否则它将正常工作。当输入随机字符串然后在下一个提示输入时,它会再次循环,然后在用户输入"退出"试。

我刚刚使用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,一切运行正常,程序退出。

但如果我运行我的程序,请输入&#34; shit&#34;在命令行中,然后输入&#34;退出&#34;在下一个提示符处,我得到第二个提示符,然后当我再次键入exit时,它会退出。我一直试图调试这个超过一个小时。感谢您提前提供任何帮助。

1 个答案:

答案 0 :(得分:1)

正如Mats所建议的那样,最好避免使用char *并坚持使用字符串。

以下示例代码与您执行相同操作并使用字符串。

以下函数将在每个char delim(例如空格)处拆分一个字符串,并用生成的部分填充elems。我从这里https://stackoverflow.com/a/236803/75517获得了它。

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);
    ...
}