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;
并分别对cmd
和key
执行操作?
是的,因为没有正确解释而被编辑。是的,这个想法,第一个词命令如何处理第二个词
两个选项。在测试之前将字符串拆分为std::vector<std::string>
或使用std::stringstream
拆分为cmd
和key
,然后执行if (cmd == "kick") switch (key) ....
或类似的操作。
【参考方案1】:
如果我知道您需要将 cmd
和 key
作为单独的输入,但用户将输入字符串 "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;
现在您已经存储了cmd
和key
,可以使用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";
(注意:您总是希望处理用户为每个cmd
或key
(或两者)输入无效内容的情况)
把它放在一个简短的例子中,你可以这样做:
#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.
您当然可以将cmd
或key
的字符串传递给单独的函数,并在那里处理您对每个函数的响应,但这只是安排代码执行相同操作的另一种方式。看看事情,让我知道这是否是你的意图。根据许多编辑,我仍然不是 100% 清楚。
【讨论】:
我很高兴shoot dog
被视为unknown cmd
。 kick dog
伤害了我。 ;-)
咯咯笑——有点诙谐幽默:)
它现在解决了,但你的方法可以正常工作,只是在我的情况下不行。公平地说,我没有很好地解释事情。我的函数都在一个while循环中,每次使用命令时都会询问输入,所以第二个 cin >> 会造成麻烦。而且我不能改变原来的cin >>。我可以这样做: if (maininput == "get") string input = maininput;播放器->get(input.substr(4));
好的,所以你有一个两部分的输入。使用if (command == "kick")
条件后,先执行命令,然后再键入。您可以采用两个单独的输入,command
在if (command == "kick")
之前,等等。然后std::cin >> key;
在if (command == "kick")
块内。很高兴你成功了。以上是关于C ++在同一行中的两个用户输入关键字加上单独的检查的主要内容,如果未能解决你的问题,请参考以下文章