开关盒总是显示默认情况

ric*_*hez 0 c++ cin switch-statement

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

代码很简单,用户不断输入等级,程序保持计数,一旦用户给出EOF条目,程序最后显示每个等级的最终计数.

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

2)所以我不完全确定"cin.get()"是如何工作的,但是如果我是对的,它会接受用户输入的第一个字符.在这里,我将'grade'作为整数变量,因为它是教科书所做的,我试图理解为什么他这样做.由于grade是一个整数变量,并且我最终将字符值作为输入,我事先检查了我输入的字符的值最终被存储为其ASCII值.然而,即使我把字符放在我的开关盒中,程序仍然设法保持工作 - >即使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();

}
Run Code Online (Sandbox Code Playgroud)

R S*_*ahu 8

我猜你输入你的输入:

A接着是Enter
B,接着是Enter
C,接着是C.Enter

等等

当你这样做,

第一次cin::get()回复'A'.
下一次调用 cin::get()返回'\n',换行符.
下一次cin::get()回复'B'.
下一次 cin::get()回复'\n'.
下一次cin::get()回复'C'.
下一次 cin::get()回复'\n'.

等等

因此,在您感知为有效输入的字符的每次"成功"处理之后,它还处理换行符,该换行符由语句的default:部分处理switch.

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

case '\n':
   break;
Run Code Online (Sandbox Code Playgroud)

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

char grade;
while ( std::cin >> grade )
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

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