Switch case 总是显示 Default case
Switch case always showing Default case
好的,这是一个由两部分组成的问题,我试图最好地解释我的疑问:
代码很简单,用户不断输入成绩,程序会记录成绩,一旦用户输入 EOF,程序就会在最后显示每个成绩的最终计数。
1) 当我 运行 代码时,程序正确地跟踪我输入的每个年级的计数,但总是落入默认情况,即使条目是正确的!为什么会这样?
2) 所以我不完全确定 "cin.get()" 是如何工作的,但如果我是对的,它会接受用户输入的第一个字符。
在这里,我把 'grade' 作为一个整数变量,因为教科书就是这样做的,我想理解他为什么这样做。由于 grade 是一个整数变量,我最终将字符值作为输入,因此我事先检查了我输入的字符值最终是否存储为它的 ASCII 值。
然而,即使我已经在我的 switch cases 中放置了字符,程序仍然设法保持工作-> 即使 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();
}
我猜你输入的是:
A 后跟回车
B 后跟回车
C 后跟回车
等等
当你这样做时,
第一次调用cin::get()
returns'A'
.
下次调用cin::get()
returns'\n'
,换行符。
下次调用 cin::get()
returns 'B'
.
下次调用 cin::get()
returns '\n'
.
下次调用 cin::get()
returns 'C'
.
下次调用cin::get()
returns'\n'
。
等等
因此,在每次 "successful" 处理您认为是有效输入的字符后,它还会处理换行符,换行符由 switch
的 default:
部分处理声明。
如果您添加代码以忽略换行符,您将看不到从 default:
子句打印的输出:
case '\n':
break;
如果你希望能够忽略所有空白字符,你可以使用:
char grade;
while ( std::cin >> grade )
{
...
}
如果这样做,就不需要代码来处理 switch
语句中的换行符。
好的,这是一个由两部分组成的问题,我试图最好地解释我的疑问:
代码很简单,用户不断输入成绩,程序会记录成绩,一旦用户输入 EOF,程序就会在最后显示每个成绩的最终计数。
1) 当我 运行 代码时,程序正确地跟踪我输入的每个年级的计数,但总是落入默认情况,即使条目是正确的!为什么会这样?
2) 所以我不完全确定 "cin.get()" 是如何工作的,但如果我是对的,它会接受用户输入的第一个字符。 在这里,我把 'grade' 作为一个整数变量,因为教科书就是这样做的,我想理解他为什么这样做。由于 grade 是一个整数变量,我最终将字符值作为输入,因此我事先检查了我输入的字符值最终是否存储为它的 ASCII 值。 然而,即使我已经在我的 switch cases 中放置了字符,程序仍然设法保持工作-> 即使 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();
}
我猜你输入的是:
A 后跟回车
B 后跟回车
C 后跟回车
等等
当你这样做时,
第一次调用cin::get()
returns'A'
.
下次调用cin::get()
returns'\n'
,换行符。
下次调用 cin::get()
returns 'B'
.
下次调用 cin::get()
returns '\n'
.
下次调用 cin::get()
returns 'C'
.
下次调用cin::get()
returns'\n'
。
等等
因此,在每次 "successful" 处理您认为是有效输入的字符后,它还会处理换行符,换行符由 switch
的 default:
部分处理声明。
如果您添加代码以忽略换行符,您将看不到从 default:
子句打印的输出:
case '\n':
break;
如果你希望能够忽略所有空白字符,你可以使用:
char grade;
while ( std::cin >> grade )
{
...
}
如果这样做,就不需要代码来处理 switch
语句中的换行符。