[英]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()等價,那么它定義在哪里?
這就是你想要的:
std::cout << std::fixed << std::setprecision(2);
std::cout << dNum;
並且不要忘記:
#include <iostream>
#include <iomanip>
沒有等價物。 使用cout
進行格式化輸出是一種痛苦。
所有建議的解決方案調用setprecision
使用長格式時,和類似的awfull。
boost::format
不支持一些非常好的功能。 與printf不兼容 。 我仍然使用printf
因為它是無與倫比的。
如果你真的想重用與C中相同的格式化技術,你可以使用Boost :: format ,它確實如此:
cout << boost::format("%.02lf") % dNum;
將您的程序保存為CPP
並運行它。
它運行並打印答案。
因為C ++也有像C
一樣的printf()
和scanf()
。
你也可以在C ++中使用sprintf來“打印”成一個字符串,然后cout那個字符串。 此策略利用您對printf樣式格式的體驗。
使用std::cout
printf()
調用的功能等價物是
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 ++標准的未來版本中刪除)。 此外,並非C ++中必須支持C99(1999 C標准)或更高版本中引入的printf()
所有功能。
要使用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
,因為cout
和stdout
是同一個對象。 否則你應該避免混合stdio
和iostreams
因為不能保證它們彼此同步。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.