簡體   English   中英

C ++相當於printf()或格式化輸出

[英]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;

但是如果有的話,在C ++中是否有printf()等價,那么它在哪里定義?

有一個標准提案P0645為C ++添加類似的格式化工具。 在此期間,您可以使用實現此提案的{fmt}庫以及更多:

#include <fmt/core.h>

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

P0645和{fmt}使用類似Python的格式字符串語法,類似於printf ,但使用{}作為分隔符而不是%

此外,類型信息也會保留,因此您不需要l或其他噪聲說明符。

將您的程序保存為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 ,因為coutstdout是同一個對象。 否則你應該避免混合stdioiostreams因為不能保證它們彼此同步。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM