前言:
经过学习,总结getchar()函数和putchar()函数在搭配使用while循环的时候,控制台窗口光标位置的出现位置的由来。
1.getchar和putchar
大家也都清楚getchar和putchar的作用了,我通过一些简单的代码来解释,以及通过一些特殊例子来说明一些情况。
1.1基本使用
这是使用的基本情况,我们知道getchar返回的是字符的ASCII,看下面的代码:
这里我们想探讨的是什么呢?可能身为读者的不知道博主想表达什么,这里想说的是,首先,getchar读取失败的时候,会返回一个EOF这个知识点,ctrl+z就是让getchar读取失败;第二就是使用int来创建变量ch来接收字符,为什么?我们知道用ASCII码表来表示字符的时候,只有0-127有表示字符,ASCII码值-1对应的字符未定义,这样的时候,当我们getchar读取失败,又用char类型创建变量,打印的时候我们格式会用%c来打印字符,此时就会像上面代码一样,输出一个正方形的错误,而我们用int类型创建变量,我们肯定是下意识用%d来打印的,那-1就原封不动打印出来,而且getchar返回值是int。这里就是想告诉读者,在%c打印字符的时候,出现了奇怪的现象,会不会是超出范围了。
1.2一些特殊打印
看完特殊打印后,最后一部分就可以更深了解getchar的等的效果啦。空杯心态哦~
我们看到这里,scanf函数遗留下来的空字符,直接被getchar读取放到ch变量里,ch变量不等于字符'Y',所以在确认Y/否认N后面直接跟着放弃确认。
最后我们还使用putchar打印了ch,ch是空字符,打印出来和换行效果一致。
函数功能
getchar() |
putchar() |
读取输入缓冲区的一个字符 |
显示要打印的一个字符 |
1.3putchar打印空格
因为我们鼠标可以在控制台上任意滑动,就会有这个白白的选中区,putchar打印的空格选中也一样,所以基本一样。
2.深度了解现象
希望读者可以自己再编译器上敲上这么一些代码自己感受一下,虽然我截图的时候,有吧光标的位置给截着出来,但还是需要去体会一番。
为什么在我们输入一个字符a后会,打印出来会跳到第三行!
有没有想过这个问题,我们知道,在输入的时候,我们输入a回车,就会来到第二行,然后就是打印a,循环结束,回到判断部分,继续读取,大家可以抢答了,读取到了什么?
对的,恭喜你答对了,读取到了'\n'放到了ch里,'\0'等于EOF吗?显然不等,'\0'的ASCII码值是0,EOF是-1。好的,putchar(ch),ch是空字符,大声告诉我,光标调到第三行是不是因为再一次putchar了!是的,由于计算机太快了,我们看不到这细微的变化。那有人说了,博主你怎么知道的,嘿嘿,请看下面的内容。
这里怎么理解while里的if条件呢?判断式表达的意思是,如果你输入的字符ASCII码值小于'0'(48)或者大于'9'(57),那么你就执行continue,重新回到判断,没有打印。也就是说,只有输入字符0-9之间的数字,才能有putchar。
这里光标不在第三行,而在紧贴在打印的内容后面。因为你看,当我们输入1回车,右边的窗口来到第二行,ch接收到了1,不等于EOF,进到循环里面,不符合if条件,没有执行continue,putchar打印出1,好的,一个循环结束;重新来到判断,getchar没有停留,因为读取到了上次留下的'\n',不等于EOF,也进入到循环,但符合条件,continue执行,ch里是空字符,但没法putchar;重新回到判断,这次有停留了,因为输入缓冲区里啥也没有,不像上面那段代码,这里的条件,使得ch为空字符的时候putchar不了,所以就在第二行的后面显示光标要我们输入。
读到这里,希望你有所收获,大家也可以去看看《令博主奔溃的scanf函数-C》,也挺有意思的内容。如果文章有内容上,排版上有问题,可以评论区下方说哦~
求点赞,求点赞,求点赞!你的点赞是我更新的动力!