我是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;
}
如何让程序忽略这些输入而不是单独接受它们?
答案 0 :(得分:1)
答案 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');
}
}