我很震惊让这个工作起来。我想做的是:
从cin
读取完整的一行,并将其扫描为integer
(使用字符串流)。如果扫描成功,则返回整数值。如果参数不是合法整数,或者字符串中出现无关字符(空白除外),则用户有机会重新输入该值。提示和重新引用参数都是可选的。
如果提供,则在读取值之前打印可选的提示字符串。如果提示不以空格结尾,则在打印时会添加空格。 如果提供,则当输入不可接受时,可选的reprompt字符串将用作错误消息。如果没有提供reprompt字符串,则使用字符串“无效的整数格式。再试一次:”。
原型是:
int getInt(const string& prompt,
const string& reprompt){
int n;
bool pass = true;
while (pass != false){
string line = getLine(prompt);
istringstream s(prompt);
s >> n >> ws;
for (size_t i = 0; i < line.length(); i++){
if (i == ': '){
return isdigit(n);
}
else if (i != ': '){
i++;
line = i + ' ';
}
}
if (s.fail() || !s.eof()){
cerr << reprompt;
pass = false;
}
}
return n;
}
结果:
3. Make sure getInt returns values correctly
Invalid integer format. Try again: X Calling getInt("123")->123:
expected [123] but found [-858993460]
答案 0 :(得分:1)
评论不能很好地处理代码,所以我把它写成答案。
您似乎想要做的是编写一个从某个输入流中读取一行的函数,然后将其解析为整数,同时验证实际的整数var输入?
然后你开始没关系,但是在解析/验证中你就搞砸了。
你需要做的只是例如。
std::string line = getLine(prompt);
for (;;)
{
std::istringstream iss(line);
int n;
if (iss >> n) // This does both parsing and validation
return n;
// If we reach here, input was not an integer
line = getLine(reprompt);
}