getchar()和EOF总结

getchar()EOF总结

师级经典的著作,要字斟句酌的去,去理解。以前在看K&RThe C Programming Language(SecondEdition)
1.5的字符/出,被getchar()EOF所迷惑了。可能主要是由于没有搞清楚getchar()的工作原理和EOF的用法。因此,很有必要总结一下,不然,很多碎的知长时间过后就会淡忘的,只有写下来才是最好的方法。


getchar()最典型的程序也就几行代而已。本人所用的境是DebianGNU/Linux,在其他系下也一
一、getchar的两点总结
1.getchar
是以行为单行存取的。
当用getchar,如果入的第一个字符有效字符(入是文件束符EOFWindows为组Ctrl+Z Unix/Linux为组Ctrl+D),那只有当最后一个入字符为换行符'\n'(也可以是文件束符EOFEOF将在后面讨论) getchar才会停止行,整个程序将会往行。譬如下面程序段: 

while((c = getchar()) != EOF){
    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的原因。

2.getchar()
的返回一般情况下是字符,但也可能是负值,即返回EOF

里要强调的一点就是,getchar函数通常返回端所入的字符,些字符系对应ASCII都是非的。因此,很多候,我会写这样的两行代 

char c;
c = getchar(); 


这样就很有可能出现问题。因getchar函数除了返回入的字符外,在遇到Ctrl+D(Linux)即文件束符EOFgetchar ()的返回EOFEOF在函数里一般定义为-1。因此,在这种情况下,getchar函数返回一个负值,把一个负值赋给一个char型的量是不正确的。了能够让所定量能包含getchar函数返回的所有可能的,正确的定方法如下(K&R C中特提到了问题)

int c;
c = getchar();

二、EOF的两点总结(主要指普通端中的EOF)
1.EOF
文件束符的情况:

EOF
然是文件束符,但并不是在任何情况下Ctrl+D(WindowsCtrl+Z)都能够实现文件束的功能,只有在下列的条件下,才作文件束符。
(1)
遇到getcahr函数,要入第一个字符就直接Ctrl+D,就可以跳出getchar(),行程序的其他部分;
(2)
在前面入的字符为换行符,接着Ctrl+D
(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         //
第二行
               //
第三行

其中第一行为终入,第二行为终出,光停在了第三行,等待新一次的入。
里也可以看出Ctrl+D行符分

转载于:https://my.oschina.net/xiaoyunhu/blog/5951

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值