C语言如何判断输入结束

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


为什么要判断输入是否结束

首先,C语言是借助于相应的缓冲区来进行输入、输出操作的。
比如常用的输入输出函数scanf、printf、getchar、putchar、gets、puts函数,都是从缓冲区读取输入数据的,并不是用户再键盘敲入一行字符串就直接读取该行字符串。
其具体工作过程为:
标准输入设备是行缓冲的,当从键盘上输入字符串,输入的字符串会首先被送到缓冲区中存储,当按下回车键后才会去检测输入缓冲区中是否有数据(即fgets、fgetchar等函数此时才去从缓冲区读取数据),输入函数从缓冲区读取数据时也会检查有没有流结束标志。
这就是为何需要判断输入是否结束。

那就会有人说了,为什么要这个缓冲区呢,直接键盘输入一个读取一个不香迈?

为什么要有缓冲区?减少磁盘读写的次数,提高计算机运行速度

那到底要怎么判断输入是否结束呢?
请往下看。

一、输入函数自带的结束标志

C语言的输入函数,有些自带了结束标志,就不需要再进行人为判断了。方便的同时也带来了一些问题,具体表现为不能将结束标志的字符作为有效输入了。但有的必有失嘛,来看看具体函数的结束标志:

//scanf()函数
结束标志:空白字符,包括空格' '、回车符'\r'、制表符 '\t'、换行符 '\n'
//gets()函数
结束标志:换行符'\n'

二、自定义结束标志符

比如定义’\0’等字符作为结束字符,当输入为’\0’时就判断为输入结束,
示例:

char ch='a';
while(ch!='\0')
{
	scanf("%c",&ch);
}

存在问题:
非代码开发者并不知道该程序定义了什么字符来作为输入结束符,需要另外提供说明文档,即使这样还是存在代码使用错误的问题。

三、利用输入函数的返回值做结束标志

输入函数scanf() gets()都有返回值,当输入到文件尾(此处“文件”可以理解为输入流)或输入错误时返回EOF,则可以在需要结束输入的时候手动键入EOF,则输入函数读取到该字符时返回EOF,就能知道输入结束了。

要注意的是,从键盘手动键入EOF并不是输入’E’、‘O’、'F’三个字母,直接键入字母只会将这三个字母放到缓冲区。
不同系统、不同情况下从键盘键入EOF的操作互不相同,具体看下面解析。

1.Windows系统中键入EOF

windows系统中键入EOF分两种情况;

  1. 输入结束位置在行首
    结束输入操作为:
Ctrl-Z↙

即先键入Ctrl-Z组合键,此时输入屏幕上回显^Z(如下图绿框所示),再按ENTER键,就会结束输入了。
在这里插入图片描述
观察上图,输出为什么会多一行空行呢?(还不知道。。。。)
2)输入结束在非行首的位置
此时要先键入ENTER迫使输出“标准输入”缓冲区之后,再按照1)的操作进行。
结束输入操作为:

↙Ctrl-Z↙

第一次键入回车后,输入光标会移动到下一行的行首,再键入Ctrl-Z组合键,回显^Z,再键入回车,才会结束输入。
总结1)、2)就是,要在行首使用Ctrl-Z↙才能结束输入。
扩充知识点:
如上所述,Ctrl-Z组合键可以作为Windows系统的输入结束标志,那真正要输入Ctrl-Z时怎么办呢?解决就是在非行首的位置直接输入组合键就好啦~毕竟要结束输入需要

“行首”、“Ctrl-Z组合键”、“↙”

缺一不可啊!

2.Linux系统中键入EOF

同样的分行首行尾两种情况:
1)结束输入在行首位置
操作:

Ctrl-D

2)结束输入在非行首位置
法一:
先键入回车(ENTER)迫使输出“标准输入”缓冲区之后,再键入Ctrl-D组合键;
法二:
在非行首的位置连续两次键入Ctrl-D组合键。

扩充知识点:
如上所述,Ctrl-D组合键可以作为Linux系统的输入结束标志,那真正要输入Ctrl-D时怎么办呢?解决办法就是先按Ctrl-V组合键,在按Ctrl-D组合键,这样就能把Ctrl-D放到缓冲区并当作合法输入读取了。
那么套娃问题来了,如何输入Ctrl-V呢?解决办法时连续两次键入Ctrl-V组合键,这是因为,Ctrl-V表示“按字面含义输入”。

好了,有关如何判断输入结束的问题先说到这里,理解尚不全面,根据后续学习可能会有补充。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值