开关盒总是显示默认情况

时间:2018-01-15 05:27:13

标签: c++ switch-statement cin

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

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

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

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

}

1 个答案:

答案 0 :(得分:8)

我猜您输入的输入为:

A后跟 Enter
B后跟 Enter
C后跟 Enter

当你这样做时,

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

因此,在每一次&#34;成功之后#34;处理您认为是有效输入的字符,它还处理换行符,由default:语句的switch部分处理。

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

case '\n':
   break;

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

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

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