2012-08-13 20 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"; 
    } 
} 

或编辑,以满足您的目的。我使用这种方法来解析简单的键/值对配置文件。工作一种享受,并且几乎不需要努力编码。