这是我的代码的一小段:
int read_prompt() {
string prompt,fname,lname,input;
int id;
cout << "customers> ";
cin >> prompt;
if (prompt.compare("add") == 0) {
cin >> id;
cin >> fname;
cin >> lname;
NewCustomer(id,fname,lname);
} else if (prompt.compare("print")==0) {
print_array();
} else if (prompt.compare("remove")==0) {
cin >> id;
RemoveCustomer(id);
} else if (prompt.compare("quit")==0) {
return 0;
} else {
cout << "Error!" << endl;
}
read_prompt();
return 0;
}
只要用户不输入任何意外内容,此方法就可以正常工作。该程序应该通过一个测试用例来传递输入“ add 125mph Daffy Duck”,其id最终为125,fname等于mph,lname等于Daffy。该函数收到所有三个变量后,它将再次调用自身并重新提示用户,然后由Duck输入哪个“错误!”。得到明显的输出。
当用户输入错误时,我该如何捕捉?在这方面,cin是最好的功能吗?我确实查询了getline(),但不确定如何实现它。
最佳答案
如果是我
我会立即读入整行,并使用std::istringstream
将其分解为用空格分隔的标记。
我将不惜一切代价避免回避。
我可能会添加更严格的错误检查。
像这样:
#include <vector>
#include <boost/lexical_cast.hpp>
#include <iostream>
#include <sstream>
#include <stdexcept>
typedef std::vector<std::string> Args;
std::istream& operator>>(std::istream& is, Args& args) {
std::string s;
if(std::getline(is, s)) {
std::istringstream iss(s);
args.clear();
while( iss >> s )
args.push_back(s);
}
return is;
}
void NewCustomer(int, std::string, std::string) {
std::cout << __func__ << "\n";
}
void RemoveCustomer(int) {
std::cout << __func__ << "\n";
}
void print_array() {
std::cout << __func__ << "\n";
}
int read_prompt() {
Args args;
while(std::cout << "customers> " && std::cin >> args) {
try {
if(args.at(0) == "add") {
NewCustomer(
boost::lexical_cast<int>(args.at(1)),
args.at(2),
args.at(3));
} else if (args.at(0) == "print") {
print_array();
} else if (args.at(0) == "remove") {
RemoveCustomer(boost::lexical_cast<int>(args.at(1)));
} else if (args.at(0) == "quit") {
return 0;
} else {
throw 1;
}
} catch(boost::bad_lexical_cast&) {
std::cout << "Error!\n";
} catch(std::out_of_range&) {
std::cout << "Error!\n";
} catch(int) {
std::cout << "Error!\n";
}
}
}
int main () {
read_prompt();
}