C语言如何判断输入结束

C语言如何判断输入结束

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

目录

为什么要判断输入是否结束一、输入函数自带的结束标志二、自定义结束标志符三、利用输入函数的返回值做结束标志1.Windows系统中键入EOF**“行首”、“Ctrl-Z组合键”、“↙”**2.Linux系统中键入EOF

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

首先,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分两种情况;

输入结束位置在行首 结束输入操作为:

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表示“按字面含义输入”。

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

尊享推荐

365娱乐app官方版下载106平台 有趣、有创意的广告语

有趣、有创意的广告语

📅 08-26 👑 25
28365-365 偏好稳健理财的看过来 宏财网是我一直在投的平台,国资背景,银行存管,已经运转快三年了,一直正常回款。项目长短都有,短的像55天的收益差不多8....
365娱乐app官方版下载106平台 陈乐基为什么不火了 陈乐基现状
365娱乐app官方版下载106平台 挖掘机定义、应用、分类及发展历程复盘