getchar函数与while((c=getchar())!=EOF)解析
1. EOF 是 -1 即读⼊的已不是正常的字符⽽是⽂件的结束符;
\t的意思⽔平制表跳到下⼀个tab的位置
2. getchar函数(字符输⼊函数)的作⽤是从终端(或系统隐含指定的输⼊设备)输⼊⼀个字符。
建筑透视图的作用getchar函数没有参数,其⼀般形式为:getchar()
函数的值就是从输⼊设备得到的字符。
如:
#include <stido.h>
void main()
concat add{
char c;
c=getchar();
putchar(c);
putchar('\n');
}
在运⾏时,如果从键盘输⼊字符‘a'并按Enter键,就会在屏幕上看到输出的字符'a'。
注:getchar函数只能接收⼀个字符。getchar函数得到的字符可以赋给⼀个字符变量或整型变量,也可以不赋给任何变量,作为表达式的⼀部分。
getchar有⼀个int型的返回值。
当程序调⽤getchar时,程序就等着⽤户按键,⽤户输⼊的字符被存放在键盘缓冲区中,直到⽤户按回车为⽌(回车字符也放在缓冲区中)。当⽤户键⼊回车之后,getchar才开始从stdin流中每次读⼊⼀个字符,getchar函数的返回值是⽤户输⼊的第⼀个字符的ASCⅡ码,如出错返回-1,且将⽤户输⼊的字符回显到屏幕。
如⽤户在按回车之前输⼊了不⽌⼀个字符,其他字符会保留在键盘缓存区中,等待后续getchar调⽤读取。也就是说,后续的getchar调⽤不会等待⽤户按键,⽽直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待⽤户按键。
⼀、getchar的两点总结:
1. getchar是以⾏为单位进⾏存取的。
当⽤getchar进⾏输⼊时,如果输⼊的第⼀个字符为有效字符(即输⼊是⽂件结束符EOF,Windows下为组合键
Ctrl+Z,Unix/Linux下为组合键Ctrl+D),那么只有当最后⼀个输⼊字符为换⾏符′\n′(也可以是⽂件结束符EOF,EOF 将在后⾯讨论)时,getchar才会停⽌执⾏,整个程序将会往下执⾏。譬如下⾯程序段:
c
{
putchar(c);
}
执⾏程序,输⼊:abc,然后回车。则程序就会去执⾏puchar(c),然后输出abc,这个地⽅不要忘了,系统输出的还有⼀个回车。然后可以继续输⼊,再次遇到换⾏符的时候,程序⼜会把那⼀⾏的输⼊的字符输出在终端上。
对于getchar,肯定很多初学的朋友会问,getchar不是以字符为单位读取的吗?那么,既然我输⼊了第⼀个字符a,肯定满⾜while循环(c = getchar()) != EOF的条件阿,那么应该执⾏putchar(c)在终端输出⼀个字符a。不错,我在⽤getchar的时候也是⼀直这么想的,但是程序就偏偏不着样执⾏,⽽是必需读到⼀个换⾏符或者⽂件结束符EOF才进⾏⼀次输出。
对这个问题的⼀个解释是,在⼤师编写C的时候,当时并没有所谓终端输⼊的概念,所有的输⼊实际上都是按照⽂件进⾏读取的,⽂件中⼀般都是以⾏为单位的。因此,只有遇到换⾏符,那么程序会认为输⼊结束,然后采取执⾏程序的其他部分。同时,输⼊是按照⽂件的⽅式存取的,那么要结束⼀个⽂件的输⼊就需⽤到EOF(Enf Of File). 这也就是为什么getchar结束
输⼊退出时要⽤EOF的原因。
这⾥要强调的⼀点就是,getchar函数通常返回终端所输⼊的字符,这些字符系统中对应的ASCII值都是⾮负的。因此,很多时候,我们会写这样的两⾏代码:
js列表添加数据char c;
c = getchar();
这样就很有可能出现问题。因为getchar函数除了返回终端输⼊的字符外,在遇到Ctrl+D(Linux下)即⽂件结束符EOF
时,getchar()的返回EOF,这个EOF在函数库⾥⼀般定义为-1。因此,在这种情况下,getchar函数返回⼀个负值,把⼀个负值赋给⼀个char型的变量是不正确的。为了能够让所定义的变量能够包含getchar函数返回的所有可能的值,正确的定义⽅法如下(K&R C中特别提到了这个问题):
int c;
c = getchar();
⼆、EOF的两点总结
1.EOF作为⽂件结束符时的情况:
EOF虽然是⽂件结束符,但并不是在任何情况下输⼊Ctrl+D(Windows下Ctrl+Z)都能够实现⽂件结束的功能,只有在下列的条件下,才作为⽂件结束符。
源码程序是什么(1)遇到getcahr函数执⾏时,要输⼊第⼀个字符时就直接输⼊Ctrl+D,就可以跳出getchar(),去执⾏程序的其他部分;
(2)在前⾯输⼊的字符为换⾏符时,接着输⼊Ctrl+D;
excel表格下面没有横向滚动条(3)在前⾯有字符输⼊且不为换⾏符时,要连着输⼊两次Ctrl+D,这时第⼆次输⼊的Ctrl+D起到⽂件结束符的功能,⾄于第⼀次的Ctrl+D的作⽤将在下⾯介绍。
其实,这三种情况都可以总结为只有在getchar()提⽰新的⼀次输⼊时,直接输⼊Ctrl+D才相当于⽂件结束符。
2.EOF作为⾏结束符时的情况,这时候输⼊Ctrl+D并不能结束getchar(),⽽只能引发getchar()提⽰下⼀轮的输⼊。
这种情况主要是在进⾏getchar()新的⼀⾏输⼊时,当输⼊了若⼲字符(不能包含换⾏符)之后,直接输⼊Ctrl+D,此时的
Ctrl+D并不是⽂件结束符,⽽只是相当于换⾏符的功能,即结束当前的输⼊。以上⾯的代码段为例,如果执⾏时输⼊abc,然后Ctrl+D,程序输出结果为:
abcabc(?不明⽩)
注意:第⼀组abc为从终端输⼊的,然后输⼊Ctrl+D,就输出第⼆组abc,同时光标停在第⼆组字符的c后⾯,然后可以进⾏新⼀次的输⼊。这时如果再次输⼊Ctrl+D,则起到了⽂件结束符的作⽤,结束getchar()。
如果输⼊abc之后,然后回车,输⼊换⾏符的话,则终端显⽰为:
abc //第⼀⾏,带回车
abc //第⼆⾏
//第三⾏putchar函数
其中第⼀⾏为终端输⼊,第⼆⾏为终端输出,光标停在了第三⾏处,等待新⼀次的终端输⼊。
从这⾥也可以看出Ctrl+D和换⾏符分别作为⾏结束符时,输出的不同结果。
EOF的作⽤也可以总结为:当终端有字符输⼊时,Ctrl+D产⽣的EOF相当于结束本⾏的输⼊,将引起getchar()新⼀轮的输⼊;当终端没有字符输⼊或者可以说当getchar()读取新的⼀次输⼊时,输⼊Ctrl+D,此时产⽣的EOF相当于⽂件结束符,程序将结束getchar()的执⾏。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论