更新
我找到了问题的原因。我一直在用鱼壳做实验。我看到评论说有人在 Mac 上成功运行了我的代码,并决定在标准的 bash shell 中尝试一下。它工作得很好。所以,我猜没有更多的鱼壳了。:)
我仍然希望知道 cin 如何以及为什么会以它的方式工作。这是我问题的主要部分。
我遇到了一个流行的问题:cin
循环使用。代码很简单,但我找不到解决方案。Google 为我提供的答案多种多样,但通常涉及cin.clear()
、cin.ignore()
和的某种组合cin.get()
。不幸的是,我无法找到解决我问题的组合或排序。此外,令我沮丧的是,我对cin
. 我宁愿不使用反复试验来解决这个问题。我想确切地了解发生了什么。
应该发生什么
当我运行我的代码时,我应该会看到一个带有选项列表的提示。我应该能够输入一个将运行其中一个选项的字符。然后,它应该再次显示提示并重复该过程,直到我选择退出选项。
实际发生了什么
一旦我运行代码,它就会将提示打印到屏幕上任意次数,并最终在提示中途停止。然后我什么也做不了,只能用^C
.
$ ./run
Choose an option:
[A]dd a score
[R]emove a player
[E]xit
: That is not a valid input.
[repeated a bunch of times]
Choose an option:
[A]dd a score
[R]emove a player
[E]xit
: That is not a valid input.
Choose ^C
$
我的问题
是什么导致 cin 这样做?作为一名经验丰富的 Java 开发人员(但也是一名初学者 C++ 开发人员),我熟悉缓冲区和流等概念,但我不知道如何cin
工作。我知道这会cin.clear()
清除错误状态,并cin.ignore()
忽略流中的许多字符。到目前为止,我的 Google-fu 一直找不到简明的参考资料。
为什么要这样做cin
?cin
在循环中使用时,应该如何想象引擎盖下会发生什么?在 C++ 中实现这个无限菜单想法的最优雅的方法是什么?
我的代码
这是我的代码的简化版本,它产生与完整版本完全相同的问题:
#include <iostream>
using namespace std;
int main () {
//infinite menu
char input;
while(true) {
//prompt
cout << "\n\nChoose an option:\n";
cout << "[A]dd a score\n";
cout << "[R]emove a player\n";
cout << "[E]xit\n";
cout << "\n\t: ";
//input
cin >> input;
//decide what the input means
switch(input) {
case 'a':
case 'A':
cout << "Add a score.\n";
break;
case 'r':
case 'R':
cout << "Remove a player.\n";
break;
case 'e':
case 'E':
cout << "Program Complete.\n";
return 0;
break;
default:
cout << "That is not a valid input.\n";
}
}
return 0;
}
我编译并运行:
$ g++ Test.cpp -o run
$ ./run
我gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
在 Mac OS X 10.8.2 上运行。