免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 4489 | 回复: 24
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-01 16:11 |只看该作者 |倒序浏览
本帖最后由 tiw 于 2012-04-01 18:46 编辑

例子是the c programming language 里的。
我不理解的是,运行程序后,当我输入a后a并不马上显示到屏幕上,而是等我输入了回车,才把之前输入的所有字母一起显示到屏幕上。
查了putchar的函数的解释,说吧一个字符输出到标准输出(这里就是屏幕)上。为什么要我打了回车之后才输出呢?

  1. #include <stdio.h>¬#include <stdio.h>
  2. main()
  3. {
  4.     putchar(97);
  5.     int c;
  6.     int i;
  7.     i = 0;
  8.     c = getchar();
  9.     while (c != EOF) {
  10.         i ++;
  11.         putchar(c);
  12.         c = getchar();
  13.     }
  14.     putchar(i);
  15. }
复制代码
我预想的
a
a
b
b

实际
ab<cr>
ab


我以为有buffer,查了半天也没查到
各位指点一下吧

http://www.chinaunix.net/jh/23/15862.html
http://www.360doc.com/content/09/0624/18/36491_4019078.shtml
http://www.360doc.com/content/10/1116/14/4640133_69822467.shtml

论坛徽章:
0
2 [报告]
发表于 2012-04-01 16:19 |只看该作者
while (c != EOF) {
        i ++;
        putchar(c);
        c = getchar();
    }


换行也是一个char

论坛徽章:
0
3 [报告]
发表于 2012-04-01 16:24 |只看该作者
你循环判断里做的是:while (c != EOF)
这里的意思是,当main函数执行到c = getchar()时,程序会停下来,等你输入一些字符。当你输入完字符后,你按回车,提交,等于说你是告诉操作系统,我这次输入已经结束,这时候,main函数才会继续走
不知道分析的对不对。。。我也是C新手

论坛徽章:
0
4 [报告]
发表于 2012-04-01 16:27 |只看该作者
slucx 发表于 2012-04-01 16:19
while (c != EOF) {
        i ++;
        putchar(c);

那我输入ab的时候,显示应该为
aabb

论坛徽章:
0
5 [报告]
发表于 2012-04-01 16:32 |只看该作者
steven_2012 发表于 2012-04-01 16:24
你循环判断里做的是:while (c != EOF)
这里的意思是,当main函数执行到c = getchar()时,程序会停下来,等 ...
  1.         putchar(c);
  2.         c = getchar();
复制代码
在getchar等下个char前putchar就该输出了

是不是系统吧我之前输入的都缓存了,知道我输入<cr>他在吧这些一骨脑的给了main啊

论坛徽章:
0
6 [报告]
发表于 2012-04-01 16:33 |只看该作者
回复 2# slucx
输入完后,打换行符,应该是不会被读入的。如果要输入换行符,好像要用\n


   

论坛徽章:
0
7 [报告]
发表于 2012-04-01 16:37 |只看该作者
回复 5# tiw
我个人理解啊:
    首先当程序走到c = getchar() 的时候,main()会把控制权交给OS,这个时候,不管你输入什么(只要不是输入回车),都由操作系统接管该程序,最后,当你敲回车的时候,你就是告诉OS,我这次的输入结束了,你可以把输入的字符转交给main()函数了,也就是说,main()应该是看不到你输入回车的。如果你要回车的效果,你可以再终端输入\n试试


   

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


有这个意思,不过C语言层次上应该更注重语意。

如果非要沿这样说下去,Unix下的解释是:读tty时,硬件(驱动)报上的数据要经过line discipline的处理,而在标准模式下,line discipline收集到一行输入才会向用户态传输,read才会返回。

论坛徽章:
0
9 [报告]
发表于 2012-04-01 17:04 |只看该作者
steven_2012 发表于 2012-04-01 16:37
回复 5# tiw
我个人理解啊:
    首先当程序走到c = getchar() 的时候,main()会把控制权交给OS,这个时 ...


这样的解释不太通,因为while里有个 c = getchar(), 如果每次到了这里就交给OS的话,返回的只是一个字符,被保存在了‘c' 里。putchar再把保存在c里的显示出来,应该就是一个字符啊,而不是回车前的所有字符。

论坛徽章:
0
10 [报告]
发表于 2012-04-01 17:18 |只看该作者
回复 9# tiw
这个应该是C语言底层实现的吧,getchar()函数是从输入读取下一个字符,直到遇到EOF。getchar()函数不是也能作用于字符流麽。而且你那里也写了while循环啊,getchar()每次从输入流读下一个字符,返回给c,然后由putchar()打印出来


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP