2015-02-24 101 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