如何只为每行输入一个输入(C ++)

时间:2014-10-09 15:38:09

标签: c++ loops cin

我是C ++的新手,正在开发一个简单的猜谜游戏,你可以尝试5次尝试1到100之间的数字。 我在处理用户输入方面遇到了问题。

我已经做到这一点,程序只接受1到100之间的数字,它会忽略字符而不会崩溃。问题是当我输入像34fa1e8这样的乱码时,循环将运行三次,第一次使用34次,第二次使用1次,最后一次使用8次,而不是像我想要的那样忽略输入。

我正在使用的代码在这里:

int check_guess() {
    int guess;
    do {
        cin >> guess;
        if (cin.fail()) {
            cin.clear();
            cin.ignore();
        }
    } while (guess < 1 || guess > 100);
    return guess;
}

如何让程序忽略这些输入而不是单独接受它们?

3 个答案:

答案 0 :(得分:1)

您可以使用getlinestol

答案 1 :(得分:0)

使用ifstream::getline将输入存储在char数组中。然后使用如下函数将其转换为整数:

int convertToInteger(char const *s){
    if ( s == NULL || *s == '\0'){
        return 0;
    }
    int result = 0, digit = 1000;
    while((*s) && (digit > 0)){
        if ( *s >= '0' && *s <= '9' ){
            result +=  digit * (*s - '0');             
        }else{
            return 0;
        }
        ++s;
        digit /= 10;
    }
    return result;
}

它起作用的原因是因为它会在失败的情况下返回0并且这是你的循环条件不接受的东西。您也不必担心负数,因为您的循环无论如何也不会接受它们。

答案 2 :(得分:0)

我之前给出了这样的答案;可以找到here的解释。

您甚至可以扩展解决方案以检查指定的范围:

template <int min, int max>
class num_get_range : public std::num_get<char>
{
public:
    iter_type do_get( iter_type it, iter_type end, std::ios_base& str,
                      std::ios_base::iostate& err, long& v) const
    {
        auto& ctype = std::use_facet<std::ctype<char>>(str.getloc());
        it = std::num_get<char>::do_get(it, end, str, err, v);

        if (it != end && !(err & std::ios_base::failbit)
                      && ctype.is(ctype.alpha, *it))
            err |= std::ios_base::failbit;
        else if (!(min <= v && v <= max))
            err |= std::ios_base::failbit;

        return it;
    }
};

现在您可以使用新的语言环境灌输流,并且需要重新构建循环以丢弃有效输入。例如:

std::locale original_locale(std::cin.getloc());
std::cin.imbue(std::locale(original_locale, new num_get_range<1, 100>));

int check_guess()
{
    int guess;
    while (!(std::cin >> guess))
    {
        std::cin.clear();
        std::cin.igore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
}
相关问题