2020年8月16日 星期日

https://dotblogs.com.tw/v6610688/2013/11/05/cplusplus_output_align_setw_set_field_width

 setw

[C++] 使cout印出格式對齊-setw 設定輸出的欄位長度

最近在一些程式,需要用到命令提示字元模式來印出結果,有時候我們會像表格一樣要每一筆資料可能有兩到三個欄位,但這時候,印出時都會因為印出的文字或數字太長而使排版跑掉

但是在C++中其實有提供一個很方便的功能可以解決你這個問題

前言

 


 

最近在一些程式,需要用到命令提示字元模式來印出結果,有時候我們會像表格一樣要每一筆資料可能有兩到三個欄位,但這時候,印出時都會因為印出的文字或數字太長而使排版跑掉,如下:

ori_output

我希望我的人物的名字與ID可以對其標題的欄位,但是預設使用cout時,是會由左向右印出的,所以長度是與欄位的格式會跑掉

 

但是在C++中其實有提供一個很方便的功能可以解決你這個問題

 

透過setw方法來完成欄位的格式對齊

 


 

setw定義在iomanip標頭檔中,是用來設定輸出資料在螢幕時,他的字元欄位的寬度(取自CPlusPlus),所以要先

#include <iomanip>

setw

 

其中輸入的參數便是你要求的最大寬度字元

如下面的例子,Name的字元長度是4,此時我在Name輸出前打上setw(5),則就表示我要對Name設定5個字元長度,然後後面輸出的資料便會靠右對齊了,但是如果你設定的字元寬度小於實際的輸出長度,setw便不會有任何反應

cout <<"Name" << "|" << 123456 <<endl;
cout << "\nUsing setw... \n" <<endl;
cout << setw(5) << "Name" << "|" <<setw(4) << 123456 <<endl;

 

example

這邊稍微記得一件事,每一次對setw做呼叫來使用,都只會對應到後面要輸出的一筆資料而已

如上面的第一個setw(5)只對字串Name作用

 

透過上述的Setw功能,來實際實踐一下後,原先的範例便會成為如下的結果:

setw_result

 

 

程式碼部分

map<string,int> students;
students["Mark"] = 123456;
students["Eason"] = 123455;
students["Jackson"] = 101454;
students["Jessica"] = 100450000;
students["zoe"] = 10025;
    
map<string, int>::iterator it;
cout << "      Name" << "|" << "        ID" <<endl;
cout << "----------" << "-" << "----------" <<endl;
for(it = students.begin() ; it != students.end() ; it++)
        cout << it->first << "|" << it->second <<endl;

cout << "\nUsing setw...\n" <<endl;

cout << "      Name" << "|" << "        ID" <<endl;
cout << "----------" << "-" << "----------" <<endl;
or(it = students.begin() ; it != students.end() ; it++)
        cout << setw(10) << it->first << "|" << setw(10)  << it->second <<endl;

 

 

結論

 


 

當然除了使用setw以外,也是可以使用C的printf調整印出格式也是另一項不錯的選擇唷^^

 

沒有留言:

張貼留言

algorithm

 #include <iostream> #include <string.h> using namespace std; int main(int argc, char** argv)  { for(int j=2;j<=100;j++)//j...