C语言习题:文件操作输入输出、从标准输入逐个字符复制到标准输出

一道输入输出简单的题目获得其他无关的知识
从标准输入逐个字符复制到标准输出,一个简单白给的题目,提到标准输入输出,直接就想到scanf和printf这两个函数,对于取字符还有getchar和putchar两个函数,预期效果是什么?从键盘架输入一个字符,从显示器输出一个字符?如果从键盘输入三个字符,那么输出的是什么字符?应该是三个字符当中的第一个字符吗?
按题目要求的效果,每次输入一个字符,输出一个相同字符。很简单用上面任何一个读函数来读取字符再调用写函数输出。
定义一个字符型变量用来保存getchar获取的字符值,然后调用输入和输出函数,输入一个字符,回车,发现输出了一个和输入字符值一样的字符。
输入几个字符时发现只能输出第一个字符,这很好理解,因为一次只能获取一个字符,然后输入函数执行,程序结束。
为了实现逐个字符输出,就要用到循环,死循环和有限循环都可以,循环体中调用getchar和putchar,用来一次一次输入输出。在这里插入图片描述
这次一次输入多个字符,getchar取一个字符,然后只输出这一个,接着进入下次循环等待下次输入。
在这里插入图片描述
结果显然不是,好像是把我们输入的所有字符全都输入出来了,在循环中getchar为什么不会每次只取一个字符呢?无论它是否读取一个字符,定义的字符变量只能容纳一个字符,输出也不可能是一个类似字符串。而系统函数getchar一次读一个字符是非常肯定的。
如果换成有限次循环,再输入数量大于循环次数的字符,我们会发现输出的字符数和循环数相等,如果定义一个变量来跟踪循环,又发现循环是正常结束,也就是说类似字符串,是一次次输出的单个字符,也说明字符是一个一个获取的。
假设输入几个字符结束之后,按下回车,这时不应该进行读取吗?而多余的字符读取不到所以只剩第一个字符,所以输出第一个字符。
问题关键是回车意义是什么,回车会不会当做getchar的结束标志。getchar函数功能是从标准输入中读取一个字符,只要存在字符就读取并返回这个字符,如果不存在则返回EOF。也就是说回车并不能作为getchar开始读取字符的标志,当你向标准输入中输入字符时,就已经被读取,然后被输出,而显示器被输入霸占着,输出结果等待显示器空闲。一旦你觉得输入结束了按下回车,显示器被输出使用,就看到所有输入的字符在屏幕中。因为回车也会被getchar读取,getchar遇到换行符并不会停止,因为没有意义,它是打印一个字符,有字符就打印字符。
如果输入回车的话,会发现回车也会被打印出来,如果强行输入一个文件结束标志(EOF)(不同系统对手动输入EOF的操作不同),发现EOF之前的字符被打印。getchar认为这个文件已经结束,之后再无字符。
如果想要加入fflush(stdin);则可以实现预期效果。清空了缓冲区,下一次循环开始将不再从上次循环缓冲区取走数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值