鱼C论坛

 找回密码
 立即注册
查看: 4155|回复: 6

一个小程序发现的奇怪问题

[复制链接]
发表于 2012-11-9 20:15:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include "stdafx.h"
  2. #include <afx.h>
  3. #include <iostream.h>
  4. int main(int argc, char* argv[])
  5. {

  6. CString m_Str("a b c d e f g ");
  7. char *p1,*p2;
  8. int length;
  9. length=m_Str.GetLength();
  10. p1=m_Str.GetBuffer(length);
  11. p2=p1+length;

  12. for(;p2>=p1;p2--)
  13. {
  14. cout<<*p2;
  15. }
  16. printf("Hello World!\n");

  17. return 0;
  18. }
复制代码
事情是这个样子的:
这段代码的运行结果为什么是先输出Hello World!再输出g f e d c b a???费解。。。
当我把cout<<*p2;改成cout<<*p2<<endl;之后,Hello World!就在最后输出了。继续费解。。。
然后我又把printf("Hello World!\n");移到for函数体内,然后我就晕了。。。。。。
求解释~~~~~~

小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-11-10 09:35:19 | 显示全部楼层
没人吗。。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-11-10 22:52:15 | 显示全部楼层
(1)用最简单的方式回答:不要混用cout和printf
(2)用比较准确的方式说:cout和printf使用的输出缓冲区是不同的,它们都是行缓冲,必须读入换行或者缓冲区满才输出。如果看不懂(2)请直接看(1)
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-11-11 10:11:46 | 显示全部楼层
谢谢光老师~看了看关于cout的东西 又有了点新收获
cout<<*p2<<flush;这样就可以把缓冲区清空并把数据搬运到输出设备了,就会得到想要的结果了~
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-11-11 10:13:19 | 显示全部楼层

{:7_181:}谢谢老师~
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-11-11 10:56:21 | 显示全部楼层
完全没看懂。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-11-11 20:27:51 | 显示全部楼层
printf 先遇到了换行符,所以先输出了,至于你cout会什么会输出 是因为程序结束了,如果你在printf后面加一句死循环的话,应该你只能看到helloword  ,以上是本人猜想,未经证实,但是原理应该不会错,属于输出缓存区的问题,有证实的给我回个 ,谢谢{:1_1:}
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-16 05:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表