printf() 或格式化输出的 C++ 等价物

C++ equivalent of printf() or formatted output

我对 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() 如果有,那么它在哪里定义?

将您的程序另存为 CPP 和 运行。

它 运行 并打印答案。

因为 C++ 也有 printf()scanf() 就像 C.

这就是你想要的:

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

别忘了:

#include <iostream>
#include <iomanip>

您还可以在 C++ 中使用 sprintf 将 'print' 转换为字符串,然后计算出该字符串。该策略利用了您在 printf 样式格式化方面的经验。

使用 std::coutprintf() 调用的功能等价物是

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

有必要 #include <iomanip><iostream>.

C++ 中的 printf() 等价物是 std::printf(),在 <cstdio> 中声明。

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

要使用 C++ 将值输出到控制台,您需要全局 ostream 对象 cout<< 运算符。 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;
}

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

您甚至可以通过自动分配缓冲区并放置在销毁时释放该内存的对象中来构建可以直接馈送到 snprintf 之上的 ostream 的东西。这加上将对象提供给 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,因为无法保证它们彼此同步。

如果您真的想重用与 C 中相同的格式化技术,您可以使用 Boost::format,它确实可以做到:

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

没有等价物。使用 cout 进行格式化输出很痛苦。

在使用长格式时,调用 setprecision 和类似方法的所有建议解决方案都非常糟糕。

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

But is there a printf() equivalent in C++ if so, then where is it defined?

有一个标准提案 P0645 to add a similar formatting facility to C++. In the meantime you can use the {fmt} library 实施此提案及更多内容:

#include <fmt/core.h>

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

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

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