无法使环路正常工作
Cant make the loop work properly
下面的代码应该让我从菜单中选择一个选项,然后显示switch语句中的相应行。只有当我选择选项"g"时,它才有效。如果我选择"c",它将显示cout
行,但随后跳过循环,程序退出。我做错了什么?
#include <iostream>
#include <cctype>
using namespace std;
enum {c='c', p='p', t='t', g='g'}; // 0-3
int main(){
cout
<< "Elija una opcion del menu:" << endl
<< "c) carnivoros" << endl
<< "p) pianista" << endl
<< "t) Arbol" << endl
<< "g) Juegos" << endl;
char eleccion;
cin.get(eleccion);
while (eleccion >= c && eleccion <= g){
switch (eleccion)
{
case 'c' : cout << "Te gusta la carne e!n"; break;
case 'p' : cout << "Sos pianista?n"; break;
case 't' : cout << "Naturista!n"; break;
case 'g' : cout << "Vicio!n"; break;
}
cout
<< "Elija una opcion del menu:" << endl;
cin.get(eleccion);
}
_getche();
return 0;
}
您的代码中有两个问题:
-
cin.get(eleccion);
不会从输入流中清除换行符,因此下次调用cin.get
时,它将读取换行符,该换行符在您指定的范围之外,并终止循环。请改用cin >> eleccion;
来解决此问题。 -
当您将ASCII字母分配给枚举时,bigges枚举不是
g
,而是t
,因此循环头应该如下所示:while ( c <= eleccion && eleccion <= t){
这个版本仍然有一个缺点,即如果输入c
和t
之间的任何字符(这是字母表的大部分),即使它不是有效的选择,循环也会继续。出于这个原因,我将更改程序如下:
using namespace std;
//enums are not needed
int main(){
cout << "Opciones:" << endl
<< "c) carnivoros" << endl
<< "p) pianista" << endl
<< "t) Arbol" << endl
<< "g) Juegos" << endl;
bool rightChar = true;
while (rightChar){
cout << "Elija una opcion del menu:" << endl;
char eleccion;
cin >> eleccion;
switch (eleccion)
{
case 'c': cout << "Te gusta la carne e!n"; break;
case 'p': cout << "Sos pianista?n"; break;
case 't': cout << "Naturista!n"; break;
case 'g': cout << "Vicio!n"; break;
default: rightChar = false;
}
}
return 0;
}
(eleccion >= c && eleccion <= g)
这条线打破了它。
enum {c='c', p='p', t='t', g='g'}; // 0-3
枚举不会是c=0。。。g=3,但它将是c=99,p=112,t=116,g=103,
因此,您的if将变成:
(eleccion >= 99 && eleccion <= 103)
而112和116显然没有通过这个条件。
正如LightningRacisinOrbit指出的那样,换行符也会出现在缓冲区中的问题。解决方案是按照MikeMB的建议使用cin >> eleccion
。
您可以将if语句中的条件更改为
(eleccion >= c && eleccion <= t)
然而,它仍然非常丑陋。也许这将是最好的:
(eleccion == c || eleccion == g || eleccion == p || eleccion == t)
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- sdl软件渲染器不工作,工作在硬件加速的一个
- C++程序已停止工作-求解常微分方程