c ++改变cin也许是skipline?

Posted

技术标签:

【中文标题】c ++改变cin也许是skipline?【英文标题】:c++ change cin maybe skipline? 【发布时间】:2012-08-13 23:02:31 【问题描述】:

我在大学时从 C++ 开始(在使用 Modula2 之前)。我对cin有问题。 在与用户交互时,我需要识别某些“命令”。,

例如“addClient Rafael”。我按以下方式处理 cin >> command, strcoll (command, "addClient"), 然后如果 command 等于 addClient, y do cin >> command2 (所以我读了拉斐尔),。并执行适当的程序...

而且,我必须识别删除所有数据库的“deleteAll”,所以我不必读取第二个参数。

当有人输入诸如“skjdsjfnsdj”之类的随机内容时,它应该说“错误命令”,如果命令不等于我的“已知”命令中的任何一个,它就会打印“错误命令”。

问题是,当某些类型“skajskajs jakasjkajs”说“错误的命令。磨损的命令”......它应该只说一次......

所以,“noskip”我的东西是没有用的,也许如果我能打破字符串..,也许更简单的方法,帮助任何人?

【问题讨论】:

请出示您的代码。听起来您应该使用 std::getline,但很难确定。 【参考方案1】:

最灵活、最直观的方法如下:

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";
    

或编辑以适合您的目的。我使用这种方法来解析简单的键/值对配置文件。工作是一种享受,几乎不费力去写代码。

【讨论】:

【参考方案2】:

您可以直接尝试istream::getline()。

这将防止每个命令的消息出现多次(由 \n 分隔)。

【讨论】:

我总是首先建议std::getline(来自),除非我知道有理由更喜欢更麻烦的istream::getline 是的,但是如果输入“addClient Rafael”,它会得到“addClientRafael”,不是吗? 它会给你输入的行,所以如果空间在那里,它将在缓冲区中。您将要做的唯一额外的事情是解析输入,以便您可以获取参数(在本例中为“Rafael”)。 @eq- 我不知道那个。我只是坚持使用标准输入方法。我得看看那个。

以上是关于c ++改变cin也许是skipline?的主要内容,如果未能解决你的问题,请参考以下文章

for 循环中的 C++ 参考

c语言 怎么解决调用函数导致的原数组改变

C#Winform编程,怎样在一个窗口f1中调用另一个窗口f2 在f2中数据改变,在f1中相应的也改变

python赋值

C:如果调用顺序改变,使用结构的嵌套函数会破坏程序

C语言最后一次作业--总结报告