getchar函数的应用------从键盘上输入“446755”,以下程序的输出结果是多少

问题:从键盘上输入“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"


  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仰望青空

这篇博文你知道我瘦了多少斤吗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值