| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 734 人关注过本帖, 2 人收藏
标题:菜鸟问几个问题,为什么\n和不\n差别那么大。求解答公式
只看楼主 加入收藏
cmtguyue
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-7-21
结帖率:100%
收藏(2)
已结贴  问题点数:5 回复次数:8 
菜鸟问几个问题,为什么\n和不\n差别那么大。求解答公式
#include <stdio.h>
int main()
{
    printf("\tfirst\b\b\bsh\\\r\'No.1\'");
}
输出结果是'No.1'
而#include <stdio.h>
int main()
{
    printf("\tfirst\b\b\bsh\\\r\'No.1\'\n");
}

输出结果是'No.1'   fish\

求解答公式
搜索更多相关主题的帖子: include 
2012-07-21 15:03
westfall999
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:40
专家分:101
注 册:2012-7-22
收藏
得分:5 
#include <stdio.h>
int main()
{
    printf("\tfirst\b\b\bsh\\\r\'No.1\'");
}
一些转义字符的含义:
\b退格键,将光标向左退一格,将并原位置上的内容擦除(包含输出显示与缓冲区)
\r将光标置在所在行的最前面,将所在显示行的内容全擦除(只包含输出显示)
\t一般情况下按一次输出8个空格,但有的编译器输出为4个。
(一般标准输入输出都是带有缓存的,一般是行缓存。对于标准输出,需要输出的数据并不是直接输出到终端上,而是首先缓存到某个地方,当遇到行刷新标志或者该缓存已满的情况下,再把缓存的数据显示到终端设备上。ANSI C中定义换行符'\n'可以认为是行刷新标志。所以,printf函数如果没有带'\n'是不会自动刷新输出流,直至缓存被填满。如果既没\n也未填满,则当系统扫描完串中的内容后,也就是""中的内容,系统下一步不会去刷新缓冲区)

按照上面的理解:对printf("\tfirst\b\b\bsh\\\r\'No.1\'\n");进行解析:
第一步:printf("\t");标准输出内容显示为:8个空格,输出缓冲区中的内容:8个空格
第二步:printf("\tfirst");标准输出内容显示为:8个空格first,输出缓冲区中的内容:8个空格first
第三步:printf("\tfirst\b\b\b");标准输出内容显示为:8个空格fi,输出缓冲区中的内容:8个空格fi
第四步:printf("\tfirst\b\b\bsh");标准输出内容显示为:8个空格fish,输出缓冲区中的内容:8个空格fish
第五步:printf("\tfirst\b\b\bsh\\");标准输出内容显示为:8个空格fish\,输出缓冲区中的内容:8个空格fish\
第六步:printf("\tfirst\b\b\bsh\\\r");标准输出内容显示为:空,输出缓冲区中的内容:8个空格fish\
第七步:printf("\tfirst\b\b\bsh\\\r\'No.1'");标准输出内容显示为:'No.1',输出缓冲区中的内容:'No.1'两个空格fish\(原8个空格已被'No.1'占去6个,所以只剩2个)
第八步:printf("\tfirst\b\b\bsh\\\r\'No.1'\n");标准输出内容显示为:'No.1'  fish\,输出缓冲区中的内容:'No.1'  fish\(这里遇到了\n换行符,所以系统对输出缓冲区进行了强制刷新,将里面的内容都输出)
如果没有\n,则不会强制刷新输出缓冲区,所以只会看到最新(最后)写入的数据,也就是'No.1',原  两个空格fish\不会被刷新输出。
收到的鲜花
  • pycansi2012-08-20 22:04 送鲜花  5朵   附言:好……
2012-07-22 20:39
c4fun
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2012-8-6
收藏
得分:0 
这些内容看上去真的很繁琐,哎!!!
2012-08-16 16:09
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用westfall999在2012-7-22 20:39:49的发言:

#include  
int main()
{
    printf("\tfirst\b\b\bsh\\\r\'No.1\'");
}
一些转义字符的含义:
\b退格键,将光标向左退一格,将并原位置上的内容擦除(包含输出显示与缓冲区)
\r将光标置在所在行的最前面,将所在显示行的内容全擦除(只包含输出显示)
\t一般情况下按一次输出8个空格,但有的编译器输出为4个。
(一般标准输入输出都是带有缓存的,一般是行缓存。对于标准输出,需要输出的数据并不是直接输出到终端上,而是首先缓存到某个地方,当遇到行刷新标志或者该缓存已满的情况下,再把缓存的数据显示到终端设备上。ANSI C中定义换行符'\n'可以认为是行刷新标志。所以,printf函数如果没有带'\n'是不会自动刷新输出流,直至缓存被填满。如果既没\n也未填满,则当系统扫描完串中的内容后,也就是""中的内容,系统下一步不会去刷新缓冲区)
 
按照上面的理解:对printf("\tfirst\b\b\bsh\\\r\'No.1\'\n");进行解析:
第一步:printf("\t");标准输出内容显示为:8个空格,输出缓冲区中的内容:8个空格
第二步:printf("\tfirst");标准输出内容显示为:8个空格first,输出缓冲区中的内容:8个空格first
第三步:printf("\tfirst\b\b\b");标准输出内容显示为:8个空格fi,输出缓冲区中的内容:8个空格fi
第四步:printf("\tfirst\b\b\bsh");标准输出内容显示为:8个空格fish,输出缓冲区中的内容:8个空格fish
第五步:printf("\tfirst\b\b\bsh\\");标准输出内容显示为:8个空格fish\,输出缓冲区中的内容:8个空格fish\
第六步:printf("\tfirst\b\b\bsh\\\r");标准输出内容显示为:空,输出缓冲区中的内容:8个空格fish\
第七步:printf("\tfirst\b\b\bsh\\\r\'No.1'");标准输出内容显示为:'No.1',输出缓冲区中的内容:'No.1'两个空格fish\(原8个空格已被'No.1'占去6个,所以只剩2个)
第八步:printf("\tfirst\b\b\bsh\\\r\'No.1'\n");标准输出内容显示为:'No.1'  fish\,输出缓冲区中的内容:'No.1'  fish\(这里遇到了\n换行符,所以系统对输出缓冲区进行了强制刷新,将里面的内容都输出)
如果没有\n,则不会强制刷新输出缓冲区,所以只会看到最新(最后)写入的数据,也就是'No.1',原  两个空格fish\不会被刷新输出。

回答真详细啊 佩服。。
2012-08-16 16:11
luxni
Rank: 1
等 级:新手上路
帖 子:5
专家分:7
注 册:2011-7-10
收藏
得分:0 
good!佩服了
2012-08-18 17:29
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
为什么不会自己查呢

总有那身价贱的人给作业贴回复完整的代码
2012-08-18 18:40
yibin
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-8-20
收藏
得分:0 
好晕啊
2012-08-20 15:50
a845117148
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-8-20
收藏
得分:0 
学习中
2012-08-20 18:57
JON_me
Rank: 2
等 级:论坛游民
帖 子:30
专家分:68
注 册:2012-5-4
收藏
得分:0 
“westfall999”回答的真详细啊!  佩服了!多多加分~~~

因为爱情,不会轻易悲伤······
2012-08-20 18:58
快速回复:菜鸟问几个问题,为什么\n和不\n差别那么大。求解答公式
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018841 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved