C++ istringstream未返回正确的值
我被这项工作所打动。我想做的是: 从C++ istringstream未返回正确的值,c++,C++,我被这项工作所打动。我想做的是: 从cin中读取完整的一行,并将其作为整数进行扫描(使用字符串流)。如果扫描成功,则返回整数值。如果参数不是合法整数,或者字符串中出现无关字符(空格除外),则用户有机会重新输入该值。prompt和reprompt参数都是可选的 如果提供,则在读取值之前打印可选提示字符串。如果提示未以空格结尾,则在打印时会添加空格。 如果提供了可选的reprompt字符串,则在输入不可接受时将其用作错误消息。如果未提供reprompt字符串,则使用字符串“无效的整数格式。请重试:”
cin
中读取完整的一行,并将其作为整数进行扫描(使用字符串流)。如果扫描成功,则返回整数值。如果参数不是合法整数,或者字符串中出现无关字符(空格除外),则用户有机会重新输入该值。prompt和reprompt参数都是可选的
如果提供,则在读取值之前打印可选提示字符串。如果提示未以空格结尾,则在打印时会添加空格。
如果提供了可选的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;
}
注释不能很好地处理代码,所以我将其作为一个答案
您似乎想做的是编写一个函数,从某个输入流中读取一行,然后将其解析为一个整数,同时验证实际的整数变量输入是否正确
然后你就可以开始了,但是在解析/验证过程中你有点搞砸了
你所要做的就是
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);
}
您可以从提示符处初始化字符串输入流,而不是刚读到的行。但是我必须承认,我没有完全遵循您的验证循环i
是行
变量中的一个位置,对吗?不是角色?不是一根绳子?但是你把它当作一个字符和一个字符串。-1因为没有发布真实的代码<代码>>>ws代码>实际上是什么?它的目的应该是什么?@πάνταῥεῖ @关于cplusplus.com的参考资料,我不多说。众所周知,它过时了,甚至提供了错误的信息。实际上我更喜欢。我想你需要if((iss>>n>>std::ws).eof())
来确保数字后面没有其他虚假字符。@Galik:请在StackOverflow中搜索“c++eof-error”,找出Joachim正确的原因。@thomasatthews我很清楚在eof()上循环的错误。
。试试我的解决方案,看看吧。结果不言而喻。我的意思是尝试验证每个解决方案的“3a”或“5DFG”。
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);
}