以下题为例
Montek公司根据员工的等级来发放相应津贴
- (等级)Grade (津贴) Allowance
-
A 300
-
B 250
-
Others 100
- 在月末计算工资 (工资和等级由用户输入)
#include <stdio.h>
int main()
{
int salary, allowance;
char grade;
printf("Please input your salary and grade:");
scanf("%d,%c", &salary, &grade);
switch (grade)
{
case 'A':
allowance = 300;
printf("salary is %d", salary + allowance);
break;
case 'B':
allowance = 250;
printf("salary is %d", salary + allowance);
break;
default:
allowance = 100;
printf("salary is %d", salary + allowance);
}
return 0;
}
在第九行, scanf("%d,%c", &salary, &grade);
转换说明(%d和%c)之间采用“,”隔开的话,在输入数据时不会产生问题(类似2000,A),程序符合预期结果。换用其他符号作为间隔也是可以的。
若第九行修改为 scanf("%d%c", &salary, &grade);
输入数据后(类似2000 A),在switch语句中,只会执行default语句。
这是为什么呢?
当scan 函数遇到一个不可能属于当前项的字符时,它会把此字符“放回原处”,以便在扫描下一个输入项或者下一次调用scanf函数时再次读入。
在你输入第一个整型数据后,你会输入空白字符作为间隔,但在下一次调用scanf时,这个空白字符作为第一个字符被读取了,而不是你输入的grade。(在这里,巧合的是空白字符和你要输入的字符是属于同一类型的)
所以,可以用getchar()函数来读走这个空白字符。
可以修改为:
scanf("%d", &salary);
getchar();
scanf("%c", &grade);
【若在输入第一个数据后,若不输入任何空白字符(换行,制表,空格等),则不会产生问题。类似2000A】
最后,附加一张图