我有一个关于一个函数的问题,该函数接受一个字符串(命令,名字和姓氏)并根据输入的内容执行。我的函数有几个if语句,如果输入被认为无效,我该如何让用户键入另一个命令?谢谢
EXAMPLE_INPUT = "CREATE John Doe"
std::string get_input(std::string& s)
{
std::string raw_input;
std::getline(std::cin, raw_input);
std::istringstream input(raw_input);
std::string command;
std::string first_name;
std::string last_name;
input >> command;
input >> first_name;
input >> last_name;
//what do I return? I can't return all 3 (command, first, last)
}
void std::string input_function(std::string& s)
{
if (s == "ONE")
{
call function_one()
}
else if (s == "TWO")
{
call function_two()
}
else
{
//How do I get user to type in something else(call get_input() again)?
}
}
答案 0 :(得分:0)
struct input_result {
std::string command;
std::string first_name;
std::string last_name;
};
让你的get输入函数返回上面的内容(input_result
)。
处理输入的函数应该具有返回失败或错误的方法。然后,调用get_input
的代码可以调用处理代码,注意它失败,然后循环回调用get_input
。
你可以将这两个函数包装成一个名为get_and_process
的函数,该函数首先得到,然后处理,如果处理失败,则重复获取。
如果您计划更改内容,则应该只使用&
,但如果不是,请改为const &
。
答案 1 :(得分:0)
如果要返回多个变量,请考虑将它们包含在结构或类中并返回该变量。关于输入另一个命令,你理论上可以使用递归作为你的帖子建议,但这只是错误的,如果用户在很多次输入错误的单词,它将使程序崩溃。相反,你可以使用一个简单的while循环:
bool success = false;
while(!success){
/* check the input, if it's correct - process it and set success to true */
}
答案 2 :(得分:0)
您通常希望通过将相关数据放在struct
(或class
)中来实现此目的:
struct whatever {
std::string command;
std::string first_name;
std::string last_name;
};
...然后为该类型重载operator>>
:
std::istream &operator>>(std::istream &is, whatever &w) {
return is >> w.command >> w.first_name >> w.last_name;
}
这允许所有数据被"返回"在单个结构中,和要在实际返回的istream
中返回的输入操作的状态,这样您就可以读取一个项目,并检查该项是否成功一次操作:
std::ifstream in("myfile.txt");
whatever x;
if ( in >> x)
// input succeeded, show some of the data we read:
std::cout << "command: " << x.command
<< "\tName: " << x.last_name << ", " << x.first_name << "\n";
else
std::cerr << "Input failed";
为了让用户在阅读失败时再次输入数据,您通常会做以下事情:
while (!in >> x)
"Please Enter command, First name and last name:\n";
请注意,在读取数据时(尤其是您希望用户以交互方式输入的数据),您几乎总是希望以这种方式检查输入。