c++ - 设置循环等待用户输入(C++)
问题描述
我试图让一个简单的井字游戏程序在控制台中运行,以确保我理解循环和数组。
它可以按预期编译和运行,但如果用户输入的不是数字,则程序会if
无限地遍历第一条语句,而没有机会添加新的输入。我真的看不出如何解决这个问题。
我认为问题在于它chosenSquare
是一个整数,因为它需要与值进行比较,但cin
可以接受任何内容。预期的行为是检查输入是否是 0 到 8 之间的整数(板上的 9 个空格),并且如果不返回消息并重复,则等待新的输入。
有一个简单的解决方法吗?在我了解基础知识的同时,我现在正在尝试避免使用专业包和名称空间。我看过类似的问题,但没有关注它们。
谢谢。
代码片段:
// Input loop
bool valid = false;
while (valid != true)
{
int chosenSquare = 0;
cout << "Player " << currentPlayer << ", enter a number between 1 and 9:" << endl;
cin >> chosenSquare;
chosenSquare--; // For array indexing
if ((chosenSquare < 0) || (chosenSquare > 8)) // <--- PROBLEM IS THIS LOOP
{
cout << "Invalid input. Try again." << endl;
continue;
}
else if ((board[chosenSquare] == currentPlayer) || (board[chosenSquare] == lastPlayer))
{
cout << "Square not availible. Try again." << endl;
continue;
}
else
{
board[chosenSquare] = currentPlayer;
valid = true;
break;
}
}
解决方案
有几件事最终导致了这种情况。
第一个是当一个字母字符被放入控制台时,错误位被设置,并且0 被写入你正在写入的变量:
您想要观察的行为在 2011 年发生了变化。在那之前:
如果提取失败(例如,如果在需要数字的地方输入了一个字母),则值保持不变并设置失败位。
但是从 C++11 开始:
如果提取失败,则将零写入 value 并设置 failbit。[...]
(来自cppr。)
这意味着chosenSquare
是0
在阅读之后,所以chosenSquare--
使它-1
。-1
,如您所知,小于0
,所以第一个 if 语句为真。
至于为什么它会无限保持这种状态,您需要清除 fail-bit。
推荐阅读
- batch-file - 单个 .bat 文件中的多个批处理文件定义
- javascript - 设置 PHP 数组以使用从 Json 对象创建的下拉列表
- batch-file - 批处理命令不读取名称中带有撇号的文件
- r - 如何根据R中的日期和时间计算移动平均值
- r - 绘制 Y(国家)对 X(年)显示 24 个国家的 GDP 同比增长(折线图)
- linux-device-driver - 同一总线上 2 个 i2c 设备的 Linux 设备树
- python - 在python中提交Kattis问题时出现运行时错误:我能猜到数据结构
- r - R - 为回归线添加图例到 ggplot 图
- python - __str__ 返回一个巨大的字符串而不是单个值。Python 新手
- docker - 构建烧瓶泊坞窗图像时分配端口