istringstream Confusion没有返回正确的值

时间:2014-09-26 19:15:46

标签: c++

我很震惊让这个工作起来。我想做的是:

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]

1 个答案:

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