C++中while>>cin循环无法通过回车退出的二十一点计牌问题
解决二十一点计牌程序的循环退出问题
原代码的问题在于使用cin >> currcard时,输入操作会自动跳过所有空白字符(包括回车、空格、制表符),所以当用户仅按下回车时,程序会一直等待有效字符输入,无法触发循环退出。要实现“输入若干字符后按回车处理,输入空行(仅回车)退出”的逻辑,我们需要改为读取整行输入,逐行处理字符,检测空行时退出循环。
修改后的代码如下:
#include<iostream> #include<string> // 需要包含string头文件来使用std::string using namespace std; int main(){ int count = 0; string line; // 用string存储整行输入 cout << "Enter cards seen on table (press Enter alone to exit): " << endl; while (getline(cin, line)) // 读取整行输入,直到输入结束或空行 { if (line.empty()) { // 检测空行,退出循环 break; } // 遍历当前行的每个字符 for (char currcard : line) { switch (currcard) { case '1': case '2': case '3': case '4': case '5': case '6': count++; break; case '7': case '8': case '9': break; case 'A': case 'J': case 'Q': case 'K': count--; break; default: cout << "Invalid Entry: '" << currcard << "' "; break; } } } cout << "Current count: " << count << endl; return 0; }
关键修改说明:
- 改用
getline(cin, line)读取整行:getline会读取用户输入的一整行内容(包括空格,但不包含末尾的换行符),当用户仅按回车时,line会成为空字符串。 - 检测空行退出循环:在每次读取行后,判断
line.empty(),如果为真则执行break退出循环。 - 遍历行内字符处理:用范围for循环遍历每行的每个字符,实现原有的计牌逻辑。
- 包含
<string>头文件:因为使用了std::string类型,必须包含对应的头文件。
内容的提问来源于stack exchange,提问作者fearlessShopkeeper
相关产品推荐
相关产品推荐

