C++ 开关外壳始终显示默认外壳

C++ 开关外壳始终显示默认外壳,c++,switch-statement,cin,C++,Switch Statement,Cin,好的,这是一个由两部分组成的问题,我试图最好地解释我的疑问: 代码很简单,用户不断输入成绩,程序会对其进行计数,一旦用户给出EOF条目,程序会在最后显示每个成绩的最终计数 1) 当我运行代码时,程序会正确地跟踪我输入的每个等级的计数,但总是落在默认情况下,即使输入是正确的!为什么会这样 2) 因此,我不完全确定“cin.get()”是如何工作的,但如果我是对的,它会接受用户输入的任何内容的第一个字符。 在这里,我把“grade”作为一个整数变量,因为教科书就是这么做的,我试图理解他为什么这么做。

好的,这是一个由两部分组成的问题,我试图最好地解释我的疑问:

代码很简单,用户不断输入成绩,程序会对其进行计数,一旦用户给出EOF条目,程序会在最后显示每个成绩的最终计数

1) 当我运行代码时,程序会正确地跟踪我输入的每个等级的计数,但总是落在默认情况下,即使输入是正确的!为什么会这样

2) 因此,我不完全确定“cin.get()”是如何工作的,但如果我是对的,它会接受用户输入的任何内容的第一个字符。 在这里,我把“grade”作为一个整数变量,因为教科书就是这么做的,我试图理解他为什么这么做。由于grade是一个整数变量,我最终将字符值作为输入,因此我事先检查了我输入的字符值是否最终存储为其ASCII值。 然而,即使我在我的开关盒中输入了字符,程序仍然能够保持work->即使grade有一个整数值(ASCII值),从技术上讲,它与“A”、“A”、“B”等进行比较。 所以我的问题是,为什么代码仍然有效

#include<iostream>
using namespace std;

void main()
{

    int grade;
    unsigned int countA=0;
    unsigned int countB=0;
    unsigned int countC=0;


    cout << "Keep entering Grades, or EOF to Quit: ";

    while ((grade=cin.get()) != EOF)
    {
        switch (grade)
        {
            case 'A':
            case 'a':
                ++countA;
                break;

            case 'B':
            case 'b':
                ++countB;
                break;

            case 'C':
            case 'c':
                ++countC;
                break;

            default:
                cout << "Wrong Entry";
                cout << endl;
                break;
        }
    }

    cout << "A count: " << countA << endl;
    cout << "B Count: " << countB << endl;
    cout << "C count: " << countC << endl;

    getchar();

}
#包括
使用名称空间std;
void main()
{
国际等级;
无符号整数a=0;
无符号整数b=0;
无符号整数c=0;

cout我猜您的输入是:

A后跟Enter
B后接回车
C后跟Enter

等等

当你这么做的时候

cin::get()
的第一次调用返回
'A'

下一次调用
cin::get()
将返回换行符
'\n'

cin::get()
的下一个调用返回
'B'

cin::get()
的下一个调用返回
'\n'

cin::get()
的下一个调用返回
'C'

cin::get()
的下一个调用返回
'\n'

等等

因此,在对您认为是有效输入的字符进行每次“成功”处理后,它还会处理换行字符,换行字符由
switch
语句的
default:
部分处理

如果添加代码以忽略换行符,则不会看到从
default:
子句打印的输出:

case '\n':
   break;

如果希望能够忽略所有空白字符,可以使用:

char grade;
while ( std::cin >> grade )
{
   ...
}

如果这样做,您就不需要代码来处理
switch
语句中的换行符。

为什么不将grade设置为
char
?@rcs,因为@rcs当我将grade设置为char时,它起作用(尽管第一个问题仍然存在)我试图理解为什么当grade是整数时程序仍然工作。你应该使用
chargrade
while(cin>>grade)…
你试过打印等级吗?打印出来是为了9710谢谢,这肯定回答了第一部分!你知道为什么即使“等级”是一个整数值,并且与字符值“a”、“a”、“B”等等进行比较,它仍然可以工作吗?@ricksanchez,当你输入
a
时,返回的整数值de>cin.get()
等于字符常量的整数值
'A'
。整数值是常量'A'的ASCII值?@ricksanchez,通常是的,但它独立于平台使用的字符编码。它也适用于使用的计算机。好的,最后一个问题,当我比较整数和Racker变量,我真正比较的是整数变量的值,和字符变量的“整数值”?