调用自身的C ++输入函数

时间:2014-11-25 00:44:43

标签: c++ string input

我有一个关于一个函数的问题,该函数接受一个字符串(命令,名字和姓氏)并根据输入的内容执行。我的函数有几个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)?
  }
}

3 个答案:

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

请注意,在读取数据时(尤其是您希望用户以交互方式输入的数据),您几乎总是希望以这种方式检查输入。