C ++相当于printf()或格式化输出

时间:2015-10-25 12:12:53

标签: c++ printf cout

我对C ++世界相对较新。 我知道std::cout用于C ++中的控制台输出。但请考虑C中的以下代码:

#include<stdio.h>

int main(){
    double dNum=99.6678;
    printf("%.02lf",dNum);
    //output: 99.67
 return 0;
}

如何在C ++中使用cout实现双重类型值的类似格式,最多2位小数?

我知道C ++与C向后兼容。但是如果有的话,C ++中是否有printf()等价,那么它在哪里定义?

9 个答案:

答案 0 :(得分:10)

这就是你想要的:

std::cout << std::fixed << std::setprecision(2);
std::cout << dNum;

并且不要忘记:

#include <iostream>
#include <iomanip>

答案 1 :(得分:3)

没有等效。使用cout格式化输出会很痛苦。

使用长格式时,调用setprecision及类似内容的所有建议解决方案都很糟糕。

boost::format不支持一些非常好的功能。 Incompatibilities with printf。我仍然使用printf,因为它是无与伦比的。

答案 2 :(得分:2)

如果你真的想重复使用与C中相同的格式化技巧,你可以使用Boost::format,它就是这样:

cout << boost::format("%.02lf") % dNum;

答案 3 :(得分:1)

  

但是,如果有的话,C ++中是否有一个printf()等效项,那么它在哪里定义?

有一个标准提案P0645,旨在为C ++添加类似的格式设置。同时,您可以使用实现该建议的{fmt} library以及其他功能:

#include <fmt/core.h>

int main()
  fmt::print("{:.02f}", 99.6678);
}

P0645和{fmt}使用类似于Python的格式字符串语法,类似于printf,但使用{}作为定界符而不是%

还保留了类型信息,因此您不需要l或其他嘈杂的说明符。

答案 4 :(得分:0)

将您的程序保存为CPP并运行它。

它运行并打印答案。

因为C ++还有printf()scanf() C

答案 5 :(得分:0)

你也可以在C ++中使用sprintf来打印&#39;进入一个字符串,然后cout该字符串。此策略利用您对printf样式格式的体验。

答案 6 :(得分:0)

printf()使用std::cout调用的功能等同于

 std::cout << fixed << setprecision(2) << dNum;

有必要#include <iomanip><iostream>

C ++中的printf()等效项为std::printf(),在<cstdio>中声明。

此外,由于向后兼容C - 特别是C ++ 98需要最大化向后兼容性C89 - C printf()中声明的<stdio.h>也可用于C ++。但请注意,<stdio.h>已弃用(标记为从C ++标准的未来版本中删除)。此外,并非C ++(1999 C标准)或更高版本中引入的printf()的所有功能都必须在C ++中受支持。

答案 7 :(得分:0)

要使用C ++将值输出到控制台,您需要全局ostream对象 cout &lt;&lt; 运算符。 endl 是另一个用作换行符的全局ostream对象。

所有都在<iostream>头文件中定义。您还可以使用各种格式标记来控制输出的显示...

#include<iostream>
using namespace std;

int main() {

    double dNum = 99.6678;

    cout << dNum;
    cout.setf(ios::scientific, ios::floatfield); // format into scientific notation
    cout << dNum;
    cout.precision(8); // change precision
    cout << dNum;

    system("pause");
    return 0;
}

答案 8 :(得分:0)

如果你想使用printf之类的格式,你应该使用snprintf(或者在其上构建一个分配变体)。请注意,sprintf要求您能够保证结果不会超出您必须保持定义的行为的缓冲区。另一方面,使用snprintf可以保证它不会超出缓冲区,因为您指定了将写入字符串的最大字符数(它将截断输出)。

你甚至可以通过自动分配缓冲区并放置在一个破坏释放内存的对象中,构建一些可以直接输入ostream snprintf的东西。此外,还有一种将对象提供给ostream的方法可以完成它。像(有改进的余地)的东西:

struct Format {
    char buf[999];

    Format(fmt, ...) {
        va_list ap;
        va_start(fmt, ap);

        vsnprintf(buf, sizeof(buf), fmt, ap);
        va_end(ap);
    }
 }

 ostream& operator<< (ostream& os, Format const& str);

然后你用它作为:

 cout << Format("The answer is %d", 42) << endl;

如果你正在使用GNU库,你当然可以直接使用printf,因为coutstdout是同一个对象。否则,您应该避免混合stdioiostreams,因为无法保证它们彼此同步。