字串格式化輸出範例

C的格式化輸出範例


C的格式化輸出只要懂了就會覺得很簡單,好用,強大,只差沒支援物件

首先需要引入

#include <stdio.h>

並且視情況需要引入string.h 

如果我想要在數字前面預留0,例如產生001, 002,這種編號,

printf("%03d", myint);

印出一個預留10個字元空間,浮點數以下顯示5位數的浮點數,最後加上換行

printf("%10.5f\n", myfloat);

如果你是要印影像的數值,可以用下面這段程式碼改一下,輸出會滿整齊的

int h,w
for (h=0 ; h<20 ; ++h)
{
  for (w=0 ; w<20 ; ++w)
  {
    printf("%4d ");
  }
  printf("\n");
}

另外C提供印到某個空間(Space),或可以說是印到字串的功能,這個功能非常好用,

但是非常危險,許多駭客的溢位攻擊都跟這種有關係,但是我們只是寫學術程式,不用管這麼多。

char mystring_buf[1024]; // 記得必須是靜態陣列或者是有配置空間的char陣列

sprintf(mystring_buf, "i can do anything with vars %10.5f\t %s\n", myfloat, my_string);

格式化輸出字串另外有一種是可以指定要輸出的字串長度,會使用到這個方法是為了安全性/空間或者是對非null-terminate string

"%*.s"


有這個函數之後就可以將兩個或多個字串串接起來,我要寫C的程式就會用它來處理多檔案與目錄的問題!

C++的格式化輸出範例


C++的格式化輸出比起C來的麻煩,但是比較不容易造成錯誤的輸出

格式速查表

首先會需要引入
#include <iomanip>

設定輸出寬度為10,文字置左,文字如果大於設定的寬度的話就沒有所謂的置左置右了

cout << setw(10) << left << mystring << endl;

設定輸出寬度為10,顯示一般數字格式(如果要換科學記號就改成scientific)文字置右,數字輸出到小數點下1位

cout << setw(10) << fixed << right << setprecision(1) << mynum << endl;

另外可以用ostringstream來處理字串的格式化輸出

ostringstream out_sstring;

out_sstring << setw(10) << fixed << right << setprecision(1) << mynum << endl;


我們輸出時間,PSNR最常會用的設定是

#include <iomanip>
cout << fixed << setprecision(4) << second_time << fixed << setprecision(4) << PSNR << endl;


如果有用OpenCV的Mat


支援直接C++的cout輸出Mat內容

Mat img;
cout <<  "MyMat=" << img << endl;

OpenCV還有提供超級方便的format函數

這個函數可以讓你用C的printf功能並回傳給你C++ string 實在好用!!

string my_filename = format("Myfiile_no%03d", myint);

留言