问题:从键盘上输入“446755”,以下程序的输出结果是多少
//getchar函数的应用
#include<stdio.h>
int main()
{
int c;
while((c=getchar())!='\n') //注释1
{
switch(c-'2') //注释2
{
case 0: //注释3
case 1:putchar(c+4); //注释4
case 2:putchar(c+4);break; //注释5
case 3:putchar(c+3); //注释6
default:putchar(c+2);break; //注释7
}
}
printf("\n");
return 0;
}
[解题思路]
1.getchar()函数:顾名思义(get character),即得到一个字符。
2.那什么是字符呢?字符常量包括普通字符和转义字符----
普通字符形如’1’、‘a’、’?’、’$‘等用单撇号括起来的一个字符(‘1234’、‘fhssgj’这种形式表达是不正确的,对于用双撇号括起来的"1234"属于字符串常量,而不是字符常量);
转义字符是以字符\开头的字符序列,如’\n’、’\t’、’\012’等。
3.getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab)
4.getchar()会从输入缓冲区去读取内容,键盘输入字符是先存在缓冲区,当我们把所有的内容都输入完成(本例中输入446755)并且按下了Enter键后,getchar()就会进入缓冲区读取字符,每一次getchar()从输入缓冲区读取一个字符,被读取的字符从缓冲区中清除。
5.接下来我们来分析下代码:
【注释1】 当用键盘输入446755时,输入内容存在缓冲区(此getchar()还没有进入缓冲区读取字符),当按下回车键时,getchar()就会进入缓冲区读取字符,此时输入缓冲区中存在7个字符 446755\n(\n换行符是按下回车键获得的)而 getchar函数的返回值是用户输入的第一个字符的ASCII码值,字符’4’对应的ASCII码值是52,故此时整型变量c=52,进入【注释2】
【注释2】:switch后面括号里的表达式值为c-‘2’=2(字符‘2’的ASCII码值为50,52-50=2;),进入【注释5】;
【注释5】:c+4=56(注意:1.这里的4是整型,非字符;2.变量c的值仍为52,不是2,虽然注释2中有表达式c-‘2’,但未再赋给变量c),ASCII码值为56对应的字符为8;故执行putchar(c+4);后输出结果8;
putchar()函数输出的是字符,不是字符的ASCII码,如putchar(97),输出的是字符a;
这里贴上代码和结果欣赏下:
#include<stdio.h>
int main()
{
putchar(97);
return 0;
}
回到本例中,输出结果8后,进入第while第2次循环,进入【注释1】,此时getchar()从缓存区读取第二个字符’4’(前面已说过,输入的第一个字符’4’已经从缓冲区清除,被用过了,还用干啥!扔了),由于第二个字符仍为’4’,故同上述步骤,经过一波操作后,屏幕上又输出8;
进入第3次循环至【注释1】, 此时getchar()从缓存区读取第3个字符’6’(字符‘6’的ASCII码值为54),满足(c=getchar())!=’\n’,代码走到【注释2】,switch后面括号里的表达式值为c-‘2’=4(字符‘2’的ASCII码值为50,54-50=4;),进入【注释7】;
【注释7】 c+2=56(注意:1.这里的2是整型,非字符;2.变量c的值仍为54,不是4,虽然注释2中有表达式c-‘2’,但未再赋给变量c),ASCII码值为56对应的字符为8;故执行putchar(c+2);后输出结果8;
再读取字符’7’……一波操作后输出9;
读取字符’5’(第一个),进入【注释6】 case 3:putchar(c+3); (注意:此语句后面没有break;,执行这条语句输出结果8,之后还没有跳出switch语句,进入注释7,接着输出7)
再读取字符’5’(第二个),同理输出结果87
最后,输入缓冲区里只剩下’\n’,不满足while()循环条件,跳出循环,
最终输入"446755",
输出"88898787"