2015-02-24 56 views
0

我正在使用C++的shell项目。我需要的所有功能都在那里。但是,有一个问题。我的退出条件是当用户输入“退出”时,它可以正常工作,除非前面的命令是一个随机字符串(例如:asldjkf)。当输入一个随机字符串,然后在下一个提示符处输入exit时,它会再次循环,然后在用户再次输入“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,一切都正常运行,然后,程序退出。

但是,如果我跑我的程序,在命令行中输入“狗屎”,然后输入“exit”的提示下,我获得了第二个提示,然后当我再次键入退出,退出。我一直在尝试调试一个多小时。感谢您提前提供任何帮助。

+2

http://stackoverflow.com/help/mcve – user657267 2015-02-24 08:22:28

+2

您的代码看起来并不像它实际上编译 - 你只需复制并粘贴各种比特在一起的那种属于彼此,但实际上不是程序如何?你似乎在用'char *'混合'std :: string'的方式不应该是必要的......这可能是也可能不是问题。 – 2015-02-24 08:46:44

+0

你应该与所有警告和调试信息('G ++ -Wall -Wextra -g')编译然后**使用调试器**('gdb') – 2015-02-24 10:21:35

回答

1

如垫建议的,优选的是避免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); 
    ... 
} 
+0

感谢您的意见,我很感激。我想我不得不离开我在这里的不幸,并以此为借口。在大部分代码中(不是很明显的在这里发布)我使用istringstream将字符串传递给参数。这个项目来自的书给出了使用char *的例子,这就是为什么它最初被引入这里的原因。 – Mars01 2015-02-24 11:09:28

+0

好的。你显示的代码对我来说是正确的。问题在别处。 – chmike 2015-02-24 15:56:13

+0

再次感谢,我缩小了它的范围,并且遇到了一个wait()调用问题。我创建了一个新线程。 http://stackoverflow.com/questions/28713400/program-stuck-on-wait – Mars01 2015-02-25 07:30:32