/ / / / / /

上一篇 下一篇 同標題 發表文章 文章列表

作者  weihan (天天天藍) 站內  CPP_DS
標題  使用 setw 設定寬字元的輸出寬度
時間  2013/04/07 Sun 10:38:06

一般若要讓輸出對齊,則通常我們會使用 setw(n) 來設定輸出的寬度。
但這用在寬字元的輸出時,則經常會造成對齊不良。

由於使用寬字元,所有的輸出全部由 wcout 負責,但每個寬字元所使用的寬度
不是一樣寬,例如:英文字母與中文字的輸出寬度就不一樣,前者使用一格寬度,
後者使用兩格寬度。而 setw(n) 的 n 是指 n 個寬字元的寬度,而不是 n 格寬度,
例如:

wstring  a = L"中央大學ncu" ;     // 共有 7 個寬字元
wcout << setw(10) << a << endl ;  // 用 10 個寬字元寬度印出 a

但 a 有 7 個寬字元,因此還有 3 個寬字元寬度,這時就插入 3 個預設的空白
格子。所以上面會印出:

12345678901234567890
   中央大學ncu
12345678901234567890

整個輸出用了 14 個格子寬度。你也可以設定 setfill 讓空白格子為一般寬字元,
例如:
wcout << setfill(L'大') ;
wcout << setw(10) << a << endl ;
則就會印出:

12345678901234567890
大大大中央大學ncu
12345678901234567890

比較兩者的輸出,前者用了 14 個格子寬度,後者用了 17 個格子寬度,而你設定
的寬度是 setw(10) ,此時你會發現使用 setw(n) 來控制寬字元的輸出格子寬度好像
沒有達到預期設定寬度的作用,這真得有點無助。

先不管 setfill ,若要使用 20 個格子寬度來印出 a 寬字串,則我們需要知道到底
寬字串 a 用了多少個格子寬度,之後再接上若干個空格,使得兩者格子寬度共為 20
個。為解決 a 輸出格子寬度的問題,在 wchar.h 標頭檔內提供了一個函式可以用。
格式為:

int  wcswidth( wchar_t* foo , int n ) ;

第一個參數為寬字元字串(此非寬字串) ,第二個參數為寬字元字串的寬字元數,
函式回傳此寬字元字串輸出會佔用的格子寬度。

例如:

int n = wcswidth(a.c_str(),a.size()) ;   // a 為寬字串,a.c_str() 為
                                         // a 的寬字元字串樣式,參考
                                         // 課本 538 頁

此時,n 為 11 (因為 a 有 4 個中文字,3 個英文字)

有了 n 以後,就可以用來對齊輸出的內容,例如:以下用 20 個格子寬度
先印出 a 在加上若干個空格,之後再接上其他內容。

wcout << a << setw(20-n) << L" " << .... ;

又例如:
    wstring  nos = L"1234567890" ;
    wstring  a = L"[一二三]" ;
    wstring  b = L"[四五]" ;
    wstring  bar = L"123" ;

    n = wcswidth(a.c_str(),a.size()) ;  // 需使用 wchar.h 標頭檔
    wcout << nos << nos << endl ;
    wcout << a << setw(10-n) << " " << L"+ " << bar << endl ;

    n = wcswidth(b.c_str(),a.size()) ;
    wcout << b << setw(10-n) << " " << L"+ " << bar << endl ;
    wcout << nos << nos << endl ;

輸出:
12345678901234567890
[一二三]  + 123
[四五]    + 123
12345678901234567890

這會列入考試的內容。若仍有所不懂,可以 google wcswidth 的用法或來找我。

以上都是使用寬字串所衍生出的問題,雖剛開始會稍嫌囉唆,但習慣了就會學得
很方便。


--
===================================================================
*               人生的意義 : 盡責任  負責任                      *
*               人生的目的 : 受報  還願  行善                *
*               人生的價值 : 奉獻  付出                        *
================================================== 聖嚴法師  語 ===

--
發信站 [中央數學  織夢天堂 bbs.math.ncu.edu.tw]
  •FROM [weihan 從 ziyou4.math.ncu.edu.tw 發表]

上一篇 下一篇 同標題 發表文章 文章列表