当前位置: 首页 > 知识库问答 >
问题:

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

申屠洛华
2023-03-14

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

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

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

2) 因此,我不完全确定“cin.get()”是如何工作的,但如果我是对的,它会接受用户输入的任何内容的第一个字符。在这里,我把“grade”作为一个整数变量,因为教科书就是这么做的,我试图理解他为什么这么做。由于grade是一个整数变量,我最终将字符值作为输入,因此我事先检查了我输入的字符值是否最终存储为其ASCII值。然而,即使我在我的开关盒中放置了字符,程序仍然能够保持工作-

#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个答案

常炯
2023-03-14

我猜您的输入是:

A后跟回车
B后跟回车
C后跟回车

当你这么做的时候,

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语句中的换行符。

 类似资料:
  • 我需要有关switch的帮助,这是我需要帮助的代码部分。 在P之后的下一种情况下,我如何才能得到一个“回车”键。我想要的是,如果用户只按了回车键,那么程序将播放另一个回合。我在考虑做字符串。valueOf(kb.nextLine())但这不起作用。 谢谢你的帮助。

  • 问题内容: 当您到达Go案例的结尾时,会遇到下一个案例,还是假设大多数应用程序不想失败,会发生什么? 问题答案: 不,默认情况下,Go switch语句不会通过。如果 确实 希望其失败,则必须显式使用“ fallthrough”语句。从规格: 在case或default子句中,最后一个非空语句可以是一个(可能标记为)“ fallthrough”语句,以指示控制权应从此子句的末尾流到下一个子句的第一

  • C#7引入了一个名为模式的新特性,您可以将其用于Is-Express或Switch案例,如下所示: 你可能会认为它会放在箱子#1里,因为它是同一种类型,但它没有。

  • 问题内容: 只是一个简单的问题: 如何清除外壳中的屏幕?我见过类似的方式: 这只是打开Windows cmd,清除屏幕并关闭,但是我希望清除外壳窗口 (PS:我不知道这有帮助,但是我使用的是Python 3.3.2版) 谢谢:) 问题答案: 对于macOS / OS X,您可以使用子进程模块并从外壳程序中调用“ cls”: 为了防止在窗口顶部显示“ 0”,请用以下内容替换第二行: 对于Linux,

  • 我正在尝试在我的应用程序中实现暗模式。我决定使用共享首选项来保存当前的暗模式状态。问题是,除了SettingsActivity之外,共享首选项总是返回所有活动的默认值。 我试过: 使用而不是 更改首选项的名称 将更改为清单为false 正在清除应用程序缓存 删除应用程序数据 我的manifest.xml: 我的家庭活动的一部分: 我的设置活动:

  • 这是我的用户。JAVA 这是我的地址。JAVA 但是当我试图持久化对象时,我得到了这个异常 错误不会来,如果我删除"NOTNULL"约束从FORIGN_KEY"USER_ID",但我需要使它作为一个NOTNULL列我应该怎么做。 这是我的注册方法 这是我的SQL脚本