免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: Godbach
打印 上一主题 下一主题

(修正版,欢迎指正)【原创】getchar()和EOF总结 [复制链接]

论坛徽章:
38
2017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:2720周年集字徽章-周	
日期:2022-01-13 15:12:33
21 [报告]
发表于 2007-08-25 18:31 |只看该作者
好多年都没用过getchar了,GUI下用处不大。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
22 [报告]
发表于 2007-08-27 10:03 |只看该作者
原帖由 醉卧水云间 于 2007-8-25 18:31 发表
好多年都没用过getchar了,GUI下用处不大。


呵呵,是啊。
BTW,楼上的GUI用什么环境开发啊?

论坛徽章:
0
23 [报告]
发表于 2007-08-27 17:09 |只看该作者
呵呵,文章写的挺好的啊。支持一下。哥们这种钻研的精神令人佩服啊。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
24 [报告]
发表于 2007-08-27 21:12 |只看该作者
呵呵,原来是herolf兄啊。:wink: :wink:

论坛徽章:
0
25 [报告]
发表于 2007-08-27 21:20 |只看该作者
现在基本上不用交互了,都用命令行选项搞定。

论坛徽章:
0
26 [报告]
发表于 2007-10-20 19:47 |只看该作者
看高手们讨论,受益菲浅,太感谢了

论坛徽章:
0
27 [报告]
发表于 2009-11-20 17:11 |只看该作者
CTRL + D 产生的字符是 EOT(end of transmission), 不是EOF 。 EOT 的ASCII 码为 4.

----------------代码的分隔线------------------------------
int Ch = 0;
while ( (Ch = getchar()) != EOF )
    fprintf(stdout, "%d ", Ch);
--------------------代码的分隔线--------------------------

在vim 中的输入模式, 使用 CTRL + V 和 CTRL +D , 即可输入 EOT 字符。将含EOT字符的文本保存为test文件。

然后 用上面的代码编译产生的可执行程序, 并执行命令 : ./main < test
就可以打印出test文本中的EOT 的 ASCII码.

如偶说的不对, 请海涵~~~

论坛徽章:
0
28 [报告]
发表于 2009-11-20 18:27 |只看该作者
下面的家伙说得不错~~~

摘抄自 :  http://www.cnitblog.com/guopingleee/archive/2009/01/29/54047.html

人们经常误认为 EOF 是从文件中读取的一个字符(牢记)。其实,EOF 不是一个字符,它被定义为是 int 类型的一个负数(比如 -1)。EOF 也不是文件中实际存在的内容。EOF 也不是只表示读文件到了结尾这一状态(这种状态可以用 feof() 来检测),它还能表示 I/O 操作中的读、写错误(通常可以用 ferror() 来检测)以及其它一些关联操作的错误状态。

论坛徽章:
0
29 [报告]
发表于 2013-12-10 12:09 |只看该作者
回复 24# Godbach


    为什么在VC6.0下连续按两次CTrl + Z不会自动退出呢?
    并且我觉得如果输入几个字符后再按一次Ctrl + Z相当于\n但是又不等价于\n
比如我这个程序
#include<stdio.h>
main()
{
int n_space,n_tab,n_enter;
int c;
n_space = n_tab = n_enter = 0;
while( (c = getchar()) != EOF)
if(c == ' ') ++ n_space;
else if(c == '\t') ++ n_tab;
else if(c == '\n') ++ n_enter;
printf("%d,%d,%d",n_space,n_tab,n_enter);
return 0;
}
运行后,如果我输入h e l,然后输入\t,然后输入一次Ctrl + Z(输两次或者更多次也是一样),都不会结束,此时再输入一次回车后,换到下一行的行首,又能够继续输入,如果这一次我输入Ctrl +Z的话,程序才会停止,并且我输入的那一次回车没有被算进去。

感觉有点混乱的感觉。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP