cout与printf的混用问题

在某题的输出混用了cout与printf(),结果输出的顺序出错。
把原因归结为一个带缓冲而一个不带缓冲。
因为stdio.h中定义了像ungetc()这样的函数,其作用是将字符放回到输入流中。可见stdio中也是使用了缓冲的。
那么为什么cout与printf()混用会发生问题呢?

#include <iostream> 
using namespace std;

int main() 
{     
    cout << "aaa";     
    printf("bbb");     
    return 0; 
}

输出为:
aaabbb
没有问题。
如果将程序修改一下:

#include <iostream> 
using namespace std;

int main() 
{     
    ios::sync_with_stdio(false);     
    cout << "aaa";     
    printf("bbb");     
    return 0; 
}

输出成了:
bbbaaa
顺序发生了错误。

sync_with_stdio()是在中定义的,当其接受true作为参数时,将会同步iostream与stdio中的流操作。默认是true,因此第一个程序的结果是正确的。
然而,尽管C++标准中规定stdio sync标志默认是true,不同平台下的不同编译器可能并不完全支持这个标准。因此也就有了通常意义上的关于“不要混用iostream与stdio”之类的警告。

如果再修改一下程序:

#include <iostream> 
using namespace std;

int main() 
{     
    ios::sync_with_stdio(false);     
    cout << "aaa" << flush;     
    printf("bbb");     
    return 0; 
}

这回程序的输出就又正确了。因为flush强制清空了缓冲区,将其中的内容输出。

  • 10
    点赞
  • 12
    收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

Accepted丶

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值