/ / / / / /

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

作者  weihan (天天天藍) 站內  CPP_DS
標題  撰寫控制寬字串輸出寬度的輸出格式處理器
時間  2013/04/08 Mon 08:57:35

由於寬字串可以是中英交雜在一起,要控制寬字串輸出時所真正所用到的格子
數量,需要先知道寬字串內到底用了多少個單格子輸出的字元(如英文字母)與
雙格子輸出的字元(如中文字),此時可以利用在 wchar.h 標頭檔內的 wcswidth
函式,此函式形式如下:

     int  wcswidth( wchar_t* str , int n ) ;

此函式在輸入寬字元字串與其字串長度,回傳此字串輸出時會佔用的格子數,
例如:
     wchar_t*  foo = L"我是一隻毛毛蟲" ;
     int  n1 = wcswidth(foo,7) ;    // n1 = 14

     wchar_t*  bar = L"i毛毛蟲" ;
     int  n2 = wcswidth(bar,4) ;    // n2 = 7

     wstring   worm = L"i蟲" ;
     int  n3 = wcswidth(worm.c_str(),worm.size()) ;  // n3 = 3

因此,若要用 20 格來印以上的各個字串,則要使用以下方式:
     wcout << foo << setw(20-n1) << L" " ;
     wcout << bar << setw(20-n2) << L" " ;
     wcout << worm << setw(20-n3) << L" " ;

若字串要靠右對齊,則要寫成:
     wcout << setw(20-n1) << L" " << foo ;
     wcout << setw(20-n2) << L" " << bar ;
     wcout << setw(20-n3) << L" " << worm ;

這樣的輸出形式著實有點麻煩,有改善的空間。我想如果可以寫成
以下方式就會方便許多:

   (a)  wcout << wsetw(20) << foo ;
   (b)  wcout << wsetw(20,Left) << foo ;

以上 (a) 與 (b) 都用 20 個格子來印 foo,但差別為 (a) 是字串靠右
對齊,(b) 為靠左對齊。

以上的 wsetw 是甚麼? 其實很簡單就是第三版書上附錄 C 所講的
內容,wsetw 為使用者自行設計的輸出格式處理器。

所以 wsetw 到底如何設計?以下就是我所設計的 wsetw :

enum  Position { Left = 1 , Right = 2 };

class  wsetw {
  private :
    wostream  *bptr ;
    Position  pos ;
    int       width ;

  public :

    // 建構函式
    wsetw( int w , Position  p = Right ) : width(w) , pos(p) {}

    // 用於 wcout << wsetw 物件
    friend  wsetw  operator<< ( wostream& out , wsetw foo ) {
        foo.bptr = &out ;
        return  foo ;
    }

    // 用於 wsetw 物件 << wstring 物件
    friend  wostream&  operator<< ( wsetw foo , const wstring& str ) {

        int  c = wcswidth(str.c_str(),str.size()) ;

        if ( foo.pos == Left ) {
            *(foo.bptr) << str ;
            if ( foo.width > c ) *(foo.bptr) << setw(foo.width-c) << L" " ;
        } else {
            if ( foo.width > c ) *(foo.bptr) << setw(foo.width-c) << L" " ;
            *(foo.bptr) << str ;
        }

        return  *(foo.bptr) ;
    }

};


如此對齊輸出的寬字串就方便多了。








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

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

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