C语言学习-getchar的使用.docVIP

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C语言学习-getchar的使用

getchar()和EOF总结 sunny.man 1.getchar 当输入终端在默认的输入模式(cooked)下时getchar是以行为单位进行存取,EOF(Unix/Linux下为组合键Ctrl+D)有两种作用,一个是换行符,一个是结束符。当缓冲区有其它字符时,它只是一个换行符,当前面没有字符是它就是一个地地道道的文件结束符。 Getchar这个函数执行过程 1.当调用getchar时,函数打开输入缓冲,并等待用户的输入。 2.用户进行输入,并结束输入(ctrl+D,回车),此时的ctrl+d只是一个结束这一次输入的动作,并不是EOF. 3.getchar从缓冲区里取一个字符,并返回. 4.缓冲区里字符队列头后移一位,等待再取。 5.回车结束和ctrl+d结束不相同,回车也做为一个字符被存到缓冲区里,而ctrl+d并没有做为一个字符存储。 6.缓冲队列没有字符,此时又按下了ctrl+d此时就是结束输入动作,也就是EOF。 譬如下面程序段: while((c = getchar()) != EOF) { putchar(c); } 执行程序并输入:”test”+”回车”。此时缓冲队列里就有”test+回车”,并开始返回一个字符”t”然后执行puchar(c)输出”t”,接着回到while取出“e”并输出”e”,反复执行直到取最后一个字符”回车”。然后可以继续输入,再次遇到换行符的时候,程序又会把那一行的输入的字符输出在终端上。如果想要结束程序执行必须在缓冲队列没有字符时输入EOF。要想正确理解这个问题 ,你就得记着linux下everything is file。从终端的输入也相当于一个文件,终端输入有两种方式,一种raw一种是cooked的。也就是一个是原始输入,一个是带缓存的。默认的方式是cooked的,所以一定要等到一个换行才完成一个缓存,而开始文件的读取,你可以用stty raw,sty cooked来分别设置。 注意: getchar()的返回值一般情况下是字符,但也可能是负值,即返回EOF。这个EOF在函数库里一般定义为-1。因此,在这种情况下,getchar函数返回一个负值,把一个负值赋给一个char型的变量是不正确的。为了能够让所定义的变量能够包含getchar函数返回的所有可能的值,正确的定义方法如下 int c; c = getchar(); 2.改变终端的输入方式 static struct termios stored_settings; void set_keypress(void) //设置终端为RAW模式,并关闭回显 { struct termios new_settings; cgetattr(0,stored_settings); new_settings = stored_settings; /* Disable canonical mode, and set buffer size to 1 byte */ new_settings.c_lflag = (~ICANON); new_settings.c_lflag = (~ECHO); new_settings.c_cc[VTIME] = 0; new_settings.c_cc[VMIN] = 1; tcsetattr(0,TCSANOW,new_settings); return; } void reset_keypress(void) //恢复终端属性 { tcsetattr(0,TCSANOW,stored_settings); return; } 也可以用system(“stty raw”) System(“stty cooked”).

文档评论(0)

asd522513656 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档