2012-08-13 90 views
0

我從大學的C++開始(在使用Modula2之前)。我對cin有問題。 在與用戶交互時,我需要識別某些「命令」,例如「addClient Rafael」,例如C++更改cin也許skipline?

。我通過以下方式處理它: cin >> command,strcoll(command,「addClient」),然後,如果命令等於addClient,那麼執行 cin >> command2(所以我讀Rafael)。並做適當的程序...

但也,我必須承認「deleteAll」,它刪除我的所有數據庫,所以我不必讀取第二個參數。

當有人輸入諸如「skjdsjfnsdj」這樣的隨機詞語時,它會被稱爲「錯誤命令」,如果命令不等於我的「已知」命令,則它會打印「錯誤命令」。

的問題是,當某些類型的「skajskajs jakasjkajs」它說:「錯誤的命令。命令撥錯」 ......它應該只說一次......

所以,「NOSKIP」我的事情是沒有用,也許如果我能打破字符串..也許更簡單的方法,幫助任何人?

+0

請顯示您的代碼。聽起來你應該使用std :: getline,但很難確定。 – robert 2012-08-13 23:06:52

回答

-1

您可以簡單地嘗試istream::getline()來代替。

它將防止每條命令出現多次消息(由\ n分隔)。

+0

我總是首先建議'std :: getline'(來自),除非我知道喜歡更麻煩的'istream :: getline'的理由。 – 2012-08-13 23:19:29

+0

是的,但如果輸入「addClient Rafael」,它會得到「addClientRafael」,不是嗎? – user1596680 2012-08-13 23:34:02

+0

它會給你輸入的行,所以如果空間在那裏,它將在緩衝區中。唯一需要做的事情就是解析輸入,以便可以獲取參數(在本例中爲'Rafael')。 – sacko87 2012-08-13 23:41:04

0

最靈活,最直觀的方式來做到這一點如下:

bool done = false; 
while(!done) { 
    string commandLine, cmd, value; 
    getline(cin, commandLine); 

    istringstream ss(commandLine); 
    ss >> cmd >> value; 

    if(cmd == "deleteAll") { 
     // BOOM 
    } 
    else if(cmd == "addClient") { 
     // Do something with 'value'. You could wait until here to read it 
     // if you want, instead of always attempting to read it. 
    } 
    else if(cmd == "quit") { 
     done = true; 
    } 
    else { 
     cout << "Wrong command\n"; 
    } 
} 

或編輯,以滿足您的目的。我使用這種方法來解析簡單的鍵/值對配置文件。工作一種享受,並且幾乎不需要努力編碼。