为了账号安全,请及时绑定邮箱和手机立即绑定

关于scanf函数的运行过程,求答疑解惑~

关于scanf函数的运行过程,求答疑解惑~

C PHP
隔江千里 2021-12-07 11:07:05
#include "stdio.h"void main(){char ch;scanf("%c",&ch);while (ch!='\n'){if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'){ch=ch+3;if(ch>'Z'&&ch<'Z'+4||ch>'z')ch=ch-26;}printf("%c ",ch);scanf("%c",&ch);}}如上程序是为了完成输入字符串的加密,将全部的字母都换成它的后面第三个字符,在输入时是一次性输入一串字符的,如:abc123,它的结果应该是def123;现在我不明白的是:scanf()函数只能一次接收一个字符串,那么我一次性输入的相当于是一个字符串,那计算机内部可能是以下的哪一种情况:1、我输入的字符先不进行运算,晢时存在一个非&ch的地方,如什么缓冲中,待我一次性全部输完,打击回车后,再开始运行程序,遇到scanf时再依次从晢存的地方将字符录入ch;2、在我输入过程中即开始运算,即当我输入完成a与将要输入b的间隙,计算机已开始运行,毕竟有了第一个字符,下面的程序已经能够进行运算了,这样,只要有一个字符输入,计算机马上开始工作,而在此过程中,printf()产生的结果则暂时存在一个暂存区,等待回车时一并输出到屏幕上。这两种运行情况倒底是哪一个呢?还是哪个都不是,还有别的解释?希望大侠们不吝惜赐教!谢谢!
查看完整描述

2 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

scanf 从标准输入流的缓冲区,按格式定义,读取数据。
如果缓冲区没有内容,或刚开始输入但尚未拍入"\n" 前, scanf 就等待。
拍入"\n"后,scanf 开始工作,按格式定义,读取数据。读过的部分就清掉,读剩的部分还留在缓冲区,下一句 scanf (或类似的其它输入函数,getchar,gets...) 接着从 剩余部分读起,读空了不够读就等待输入。
fflush() 可用于清除 缓冲区 剩余内容。

查看完整回答
反对 回复 2021-12-12
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

是你说的第一种。你一次性输入的字符串是连续的在一块内存中。然后scanf函数去了这个字符串里面的第一个。所以就是这样的情况。
你可以自己在 while语句那里设置一个断点,调试一下看看。

查看完整回答
反对 回复 2021-12-12
  • 2 回答
  • 0 关注
  • 306 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信