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);
}