免费注册 查看新帖 |

Chinaunix

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

弱弱的一个C问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-04-01 17:20 |只看该作者
tempname2 发表于 2012-04-01 16:56
回复 7# steven_2012

这个解释比较同,就是缓存在了“read”里?在一次给main,getchar读read里的每个字符,直到read里没有为止?

论坛徽章:
0
12 [报告]
发表于 2012-04-01 17:26 |只看该作者
本帖最后由 sernix 于 2012-04-01 17:35 编辑

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <termios.h>
  6. #include <errno.h>

  7. static int __getch(int *_ch)
  8. {
  9.         int ret, ch;
  10.         struct termios old, new;

  11.         ret = tcgetattr(STDIN_FILENO, &old);
  12.         if (ret < 0) {
  13.                 ret = errno;
  14.                 goto err_ret;
  15.         }

  16.         memcpy(&new, &old, sizeof(struct termios));

  17.         new.c_lflag &= ~(ICANON);

  18.         ret = tcsetattr(STDIN_FILENO, TCSANOW, &new);
  19.         if (ret < 0) {
  20.                 ret = errno;
  21.                 goto err_ret;
  22.         }

  23.         ch = getchar();

  24.         ret = tcsetattr(STDIN_FILENO, TCSANOW, &old);
  25.         if (ret < 0) {
  26.                 ret = errno;
  27.                 goto err_ret;
  28.         }

  29.         *_ch = ch;

  30.         return 0;
  31. err_ret:
  32.         return ret;
  33. }

  34. int main(int argc, char *argv[])
  35. {
  36.         int ret, ch;

  37.         do {
  38.                 (void) __getch(&ch);

  39.                 putchar(ch);
  40.         } while (ch != '\n');

  41.         return 0;
  42. }
复制代码

论坛徽章:
0
13 [报告]
发表于 2012-04-01 17:27 |只看该作者
回复 11# tiw
应该是这样的吧,具体的还是等大神来回答吧,以我的见解,这样也能自圆其说了。毕竟getchar()是能作用于输入流的。


   

论坛徽章:
0
14 [报告]
发表于 2012-04-01 17:28 |只看该作者
steven_2012 发表于 2012-04-01 17:18
回复 9# tiw
这个应该是C语言底层实现的吧,getchar()函数是从输入读取下一个字符,直到遇到EOF。getch ...


我觉得不是直到遇到EOF,而是吧read里的所有字符都读完,就接着等用户的下一次输入。EOF是用来推出程序的

论坛徽章:
0
15 [报告]
发表于 2012-04-01 17:30 |只看该作者
我记得是: 你键入的字符会暂时存放在键盘缓冲区内,当按会车时,getchar会从缓冲区内读字符,回车也是字符,毕竟输一个读一个cpu进入内核调度是很费资源的吗,所以就等用户都输完了,一次性读入,再输出。但按ctrl+D时会产生EOF,循环就会停止。

论坛徽章:
0
16 [报告]
发表于 2012-04-01 17:30 |只看该作者
回复 14# tiw
不是的,EOF的意思是end of file,退出程序用其他的函数调用。EOF代表一个文件的末尾,是一个特殊符号,退出程序代表这个进程就被kill了



   

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
17 [报告]
发表于 2012-04-01 17:35 |只看该作者
回复 11# tiw


不是缓存在read里,是read根本就没法返回,到read这里整个程序就停住了。直到操作系统得到一行数据时read才返回,程序才能往下走。

论坛徽章:
0
18 [报告]
发表于 2012-04-01 17:56 |只看该作者
gavindlutsw 发表于 2012-04-01 17:30
我记得是: 你键入的字符会暂时存放在键盘缓冲区内,当按会车时,getchar会从缓冲区内读字符,回车也是字符 ...


ctr-D 就是EOF啊,难怪python的shell推出用ctr-D。ctr-C ctr-D都可以退出程序,但是完全两个不通的方法啊

论坛徽章:
0
19 [报告]
发表于 2012-04-01 17:58 |只看该作者
steven_2012 发表于 2012-04-01 17:30
回复 14# tiw
不是的,EOF的意思是end of file,退出程序用其他的函数调用。EOF代表一个文件的末尾,是一 ...

不好意思,我没表达清楚,我想说的是当getchr读到EOF的时候while就跳出了,程序就自然结束了,而不是输入ctr-c杀掉进程

论坛徽章:
0
20 [报告]
发表于 2012-04-01 18:01 |只看该作者
tempname2 发表于 2012-04-01 17:35
回复 11# tiw


,我概念没搞清楚。大致怎么回事我有点感觉了。要搞清从tty输入到程序接收到这些输入要看那方面的代码或者书啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP