C ++在同一行中的两个用户输入关键字加上单独的检查

Posted

技术标签:

【中文标题】C ++在同一行中的两个用户输入关键字加上单独的检查【英文标题】:C++ Two user input keywords in the same line plus separate checking 【发布时间】:2019-11-18 05:29:20 【问题描述】:

我一直在尝试让 if 语句与两个关键词一起工作。基本上,我的程序将检查第一个词作为“命令”词(如 get、set 等),将触发特定方法的词,第二个词作为要在列表中搜索的词,作为要使用的对象.它们必须一起写在同一行中。

我知道getline 可以输入多个单词,cin >> this >> that 也可以。但是对于单独的检查,我无法弄清楚。 有人建议我使用子字符串,但不知道该怎么做。

示例: 第一个词作为命令,其他作为搜索键。

if(command == "kick")

    std::cin >> input;  //user input "ball"
    person->kick(input) //pointer to function in another class
    ***kicks the ball


if(command == "pick")

    std::cin >> input; //user input "ball"
    person->pick(input) //pointer to function in another class
    ***picks the ball


if(command == "throw")

    std::cin >> input;   //user input "paper"
    person->throw(input) //pointer to function in another class
    ***throws the paper

它有效,但我的输入应该是:

踢球或 挑球

而不是

等等。

这可能非常简单,我只是 C++ 的新手。 但它必须在同一行输入中,否则可能会有更好的方法。

希望得到一些帮助。 谢谢;)

【问题讨论】:

您是在问如何处理if (input == "kick" && input == "ball") 或在您的if 语句中使用两个条件的东西吗? 不,那只会同时检查两者。基本上它必须检查第一个词作为命令词,即触发该特定方法的词。第二个词是实际检查方法内部并用它做事的词。因为对于相同的不同对象,我会有不同的方法和不同的命令 通过编辑很明显它们是一个字符串。进行比较后,是否需要检查字符串中的第二个单词?您能否将"kick ball""kick dog" 包含在if (input == "kick") /* then handle what to kick? */ 中?看起来您想使用std::stringstream ss (input);,然后使用ss >> cmd >> key; 并分别对cmdkey 执行操作? 是的,因为没有正确解释而被编辑。是的,这个想法,第一个词命令如何处理第二个词 两个选项。在测试之前将字符串拆分为std::vector<std::string> 或使用std::stringstream 拆分为cmdkey,然后执行if (cmd == "kick") switch (key) .... 或类似的操作。 【参考方案1】:

如果我知道您需要将 cmdkey 作为单独的输入,但用户将输入字符串 "cmd key" 并且您需要单独处理每个,那么一个简单的方法是读取每个使用普通的>> 运算符转换为std:string,例如

    std::string cmd, key;

    std::cout << "enter command & key: ";
    if (!(std::cin >> cmd >> key))     /* read/validate both cmd & key */
        std::cerr << "stream error or use canceled input.\n";
        return 1;
    

现在您已经存储了cmdkey,可以使用cmd 来初步确定要采取的分支,然后根据key 选择要采取的行动。例如:

    if (cmd == "kick")         /* handle cmd "kick" */
        if (key == "ball")
            std::cout << "kicking the ball.\n";
        else if (key == "dog")
            std::cout << "kicking the dog.\n";
        else
            std::cout << "generally kicking the " << key << ".\n";
    
    else if (cmd == "pick")    /* handle cmd "pick" */
        if (key == "ball")
            std::cout << "picking the ball.\n";
        else if (key == "dog")
            std::cout << "picking the dog.\n";
        else
            std::cout << "generally picking the " << key << ".\n";
    
    else    /* otherwise unknown command */
        std::cout << "unknown cmd: " << cmd << ".\n";

注意:您总是希望处理用户为每个cmdkey(或两者)输入无效内容的情况)

把它放在一个简短的例子中,你可以这样做:

#include <iostream>
#include <string>

int main (void) 

    std::string cmd, key;

    std::cout << "enter command & key: ";
    if (!(std::cin >> cmd >> key))     /* read/validate both cmd & key */
        std::cerr << "stream error or use canceled input.\n";
        return 1;
    

    if (cmd == "kick")         /* handle cmd "kick" */
        if (key == "ball")
            std::cout << "kicking the ball.\n";
        else if (key == "dog")
            std::cout << "kicking the dog.\n";
        else
            std::cout << "generally kicking the " << key << ".\n";
    
    else if (cmd == "pick")    /* handle cmd "pick" */
        if (key == "ball")
            std::cout << "picking the ball.\n";
        else if (key == "dog")
            std::cout << "picking the dog.\n";
        else
            std::cout << "generally picking the " << key << ".\n";
    
    else    /* otherwise unknown command */
        std::cout << "unknown cmd: " << cmd << ".\n";

使用/输出示例

$ ./bin/cmd_select
enter command & key: kick dog
kicking the dog.

使用命令"pick":

$ ./bin/cmd_select
enter command & key: pick ball
picking the ball.

使用未知命令:

$ ./bin/cmd_select
enter command & key: shoot dog
unknown cmd: shoot.

您当然可以将cmdkey 的字符串传递给单独的函数,并在那里处理您对每个函数的响应,但这只是安排代码执行相同操作的另一种方式。看看事情,让我知道这是否是你的意图。根据许多编辑,我仍然不是 100% 清楚。

【讨论】:

我很高兴shoot dog 被视为unknown cmdkick dog 伤害了我。 ;-) 咯咯笑——有点诙谐幽默:) 它现在解决了,但你的方法可以正常工作,只是在我的情况下不行。公平地说,我没有很好地解释事情。我的函数都在一个while循环中,每次使用命令时都会询问输入,所以第二个 cin >> 会造成麻烦。而且我不能改变原来的cin >>。我可以这样做: if (maininput == "get") string input = maininput;播放器->get(input.substr(4)); 好的,所以你有一个两部分的输入。使用if (command == "kick") 条件后,先执行命令,然后再键入。您可以采用两个单独的输入,commandif (command == "kick") 之前,等等。然后std::cin &gt;&gt; key;if (command == "kick") 块内。很高兴你成功了。

以上是关于C ++在同一行中的两个用户输入关键字加上单独的检查的主要内容,如果未能解决你的问题,请参考以下文章

用户输入

如何使不同的 Django 表单输入按钮显示在同一行

有没有办法检查左侧单元格的值并将计数加两个,除非在同一行的另一个单元格中输入了一个值?

C# 控制台日期输入

python2.7在同一行的两个输入内退出(以空格分隔)

c语言输入的值如何在同一行打印输出