(轉)CString轉int _ttoi() _tcstoul() Format ASSERT() Format的用法

 

CString 型轉化成 int 型  把 CString 類型的數據轉化成整數類型最簡單的方法就是使用標準的字符串到整數轉換例程。

  雖然通常你懷疑使用_atoi()函數是一個好的選擇,它也很少會是一個正確的選擇。如果你準備使用 Unicode 字符,你應該用_ttoi(),它在 ANSI 編碼系統中被編譯成_atoi(),而在 Unicode 編碼系統中編譯成_wtoi()。你也可以考慮使用_tcstoul()或者_tcstol(),它們都能把字符串轉化成任意進制的長整數(如二進制、八進制、十進制或十六進制),不同點在於前者轉化後的數據是無符號的(unsigned),而後者相反。看下面的例子:

  CString hex = _T("FAB");

  CString decimal = _T("4011");

  ASSERT(_tcstoul(hex, 0, 16) == _ttoi(decimal)); 

在做DWORD與 CString 比較的時候 ,需要將CString 轉換成 DWORD,有幾種轉換方法,但是明明轉換結果是一樣的,可就是提示不相等,後來 _tcstoul()轉換後才相等 ,記錄下
    CString str = lp->GetSubItem(nCol);    
                        //    MessageBox(str,m_strItem,MB_OK);
                        
                        DWORD dwData = _tcstoul( str, NULL, 10 ); // 10進制
                        if (dwItem ==dwData)
                        {
                            //AfxMessageBox("找到找到找到找到找到找到找到找到找到找到找到找到找到");                            
                             return pCur;
                        }


使用_tcstoul()或者_tcstol(),它們都能把字符串轉化成任意進制的長整數(如二進制、八進制、十進制或十六進制),不同點在於前者轉化後的數據是無符號的(unsigned),而後者相反。看下面的例子:
CString hex = _T("FAB");
CString decimal = _T("4011");
ASSERT(_tcstoul(hex, 0, 16) == _ttoi(decimal));

 

////////////////////////////////////////////////////////////////////////////////////////////////////

Format函數

  VC++中Format函數詳解
  首先看它的聲明: 
  function Format(const Format: string; const Args: array of const): string; overload; 
  事實上Format方法有兩個種形式,另外一種是三個參數的,主要區別在於它是線程安全的, 
  但並不多用,所以這裏只對第一個介紹: 
  function Format(const Format: string; const Args: array of const): string; overload; 
  Format參數是一個格式字符串,用於格式化Args裏面的值的。Args又是什麼呢, 
  它是一個變體數組,即它裏面可以有多個參數,而且每個參數可以不同。 
  如以下例子: 
  Format("my name is %6s","wind"); 
  返回後就是 
  my name is wind 
  
  現在來看Format參數的詳細情況: 
  Format裏面可以寫普通的字符串,比如"my name is" 
  但有些格式指令字符具有特殊意義,比如"%6s" 
  格式指令具有以下的形式: 
  "%" [index ":"] ["-"] [width] ["." prec] type 
  它是以"%"開始,而以type結束,type表示一個具體的類型。中間是用來 
  格式化type類型的指令字符,是可選的。 
  先來看看type,type可以是以下字符: 
  d 十制數,表示一個整型值 
  u 和d一樣是整型值,但它是無符號的,而如果它對應的值是負的,則返回時 
  是一個2的32次方減去這個絕對值的數 
  如:Format("this is %u",-2); 
  返回的是:this is 4294967294 
  f 對應浮點數 
  e 科學表示法,對應整型數和浮點數, 
  比如Format("this is %e",-2.22); 
  返回的是:this is -2.220000E+000 
  等一下再說明如果將數的精度縮小 
  g 這個只能對應浮點型,且它會將值中多餘的數去掉 
  比如Format("this is %g",02.200); 
  返回的是:this is 2.2 
  n 只能對應浮點型,將值轉化爲號碼的形式。看一個例子就明白了 
  Format("this is %n",4552.2176); 
  返回的是this is 4,552.22 
  注意有兩點,一是隻表示到小數後兩位,等一下說怎麼消除這種情況 
  二是,即使小數沒有被截斷,它也不會也像整數部分一樣有逗號來分開的 
  m 錢幣類型,但關於貨幣類型有更好的格式化方法,這裏只是簡單的格式化 
  另外它只對應於浮點值 
  Format("this is %m",9552.21); 
  返回:this is ¥9,552.21 
  p 對應於指針類型,返回的值是指針的地址,以十六進制的形式來表示 
  例如: 
  Format("this is %p",p); 
  Edit1的內容是:this is 0012F548 
  s 對應字符串類型,不用多說了吧 
  x 必須是一個整形值,以十六進制的形式返回 
  Format("this is %X",15); 
  返回是:this is F 
  
  類型講述完畢,下面介紹格式化Type的指令: 
  [index ":"] 這個要怎麼表達呢,看一個例子 
  Format("this is %d %d",12,13); 
  其中第一個%d的索引是0,第二個%d是1,所以字符顯示的時候 
  是這樣 this is 12 13 
  
  而如果你這樣定義: 
  Format("this is %1:d %0:d",12,13); 
  那麼返回的字符串就變成了 
  this is 13 12 
  現在明白了嗎,[index ":"] 中的index指示Args中參數顯示的 
  順序 
  還有一種情況,如果這樣Format("%d %d %d %0:d %d", 1, 2, 3, 4) ;
  將返回1 2 3 1 2。 
  如果你想返回的是1 2 3 1 4,必須這樣定: 
  Format("%d %d %d %0:d %3:d", 1, 2, 3, 4) ;
  但用的時候要注意,索引不能超出Args中的個數,不然會引起異常 
  如Format("this is %2:d %0:d",12,13); 
  由於Args中只有12 13 兩個數,所以Index只能是0或1,這裏爲2就錯了 
  [width] 指定將被格式化的值佔的寬度,看一個例子就明白了 
  Format("this is %4d",12); 
  輸出是:this is 12 
  這個是比較容易,不過如果Width的值小於參數的長度,則沒有效果。 
  如:Format("this is %1d",12); 
  輸出是:this is 12 
  ["-"] 這個指定參數向左齊,和[width]合在一起最可以看到效果: 
  Format("this is %-4d,yes",12); 
  輸出是:this is 12 ,yes 
  ["." prec] 指定精度,對於浮點數效果最佳: 
  Format('this is %.2f',['1.1234]); 
  輸出 this is 1.12 
  Format('this is %.7f',['1.1234]); 
  輸了 this is 1.1234000 
  而對於整型數,如果prec比如整型的位數小,則沒有效果 
  反之比整形值的位數大,則會在整型值的前面以0補之 
  Format('this is %.7d',[1234]); 
  輸出是:this is 0001234] 
  
  對於字符型,剛好和整型值相反,如果prec比字符串型的長度大 
  則沒有效果,反之比字符串型的長度小,則會截斷尾部的字符 
  Format('this is %.2s',['1234']); 
  輸出是 this is 12 
  
  而上面說的這個例子: 
  Format('this is %e',[-2.22]); 
  返回的是:this is -2.22000000000000E+000 
  怎麼去掉多餘的0呢,這個就行啦 
  Format('this is %.2e',[-2.22]); 
  好了,第一個總算講完了,應該對他的應用很熟悉了吧 
  /////////////////////////////////////////////////////////////// 
  二 FormatDateTime的用法 
  他的聲明爲: 
  function FormatDateTime(const Format: string; DateTime: TDateTime): string; 
  overload; 
  當然和Format一樣還有一種,但這裏只介紹常用的第一種 
  Format參數是一個格式化字符串。DateTime是時間類型。返回值是一種格式化後的 
  字符串 
  重點來看Format參數中的指令字符 
  c 以短時間格式顯示時間,即全部是數字的表示 
  FormatdateTime('c',now); 
  輸出爲:2004-8-7 9:55:40 
  d 對應於時間中的日期,日期是一位則顯示一位,兩位則顯示兩位 
  FormatdateTime('d',now); 
  輸出可能爲1~31 
  dd 和d的意義一樣,但它始終是以兩位來顯示的 
  FormatdateTime('dd',now); 
  輸出可能爲01~31 
  ddd 顯示的是星期幾 
  FormatdateTime('ddd',now); 
  輸出爲: 星期六 
  dddd 和ddd顯示的是一樣的。 
  但上面兩個如果在其他國家可能不一樣。 
  ddddd 以短時間格式顯示年月日 
  FormatdateTime('ddddd',now); 
  輸出爲:2004-8-7 
  dddddd 以長時間格式顯示年月日 
  FormatdateTime('dddddd',now); 
  輸出爲:2004年8月7日 
  e/ee/eee/eeee 以相應的位數顯示年 
  FormatdateTime('ee',now); 
  輸出爲:04 (表示04年) 
  m/mm/mmm/mmmm 表示月 
  FormatdateTime('m',now); 
  輸出爲:8 
  FormatdateTime('mm',now); 
  輸出爲 08 
  FormatdateTime('mmm',now); 
  輸出爲 八月 
  FormatdateTime('mmmm',now); 
  輸出爲 八月 
  和ddd/dddd 一樣,在其他國家可能不同 
  yy/yyyy 表示年 
  FormatdateTime('yy',now); 
  輸出爲 04 
  FormatdateTime('yyyy',now); 
  輸出爲 2004 
  h/hh,n/nn,s/ss,z/zzz 分別表示小時,分,秒,毫秒 
  t 以短時間格式顯示時間 
  FormatdateTime('t',now); 
  輸出爲 10:17 
  tt 以長時間格式顯示時間 
  FormatdateTime('tt',now); 
  輸出爲10:18:46 
  ampm 以長時間格式顯示上午還是下午 
  FormatdateTime('ttampm',now); 
  輸出爲:10:22:57上午 
  
  大概如此,如果要在Format中加普通的字符串,可以用雙引號隔開那些 
  特定義的字符,這樣普通字符串中如果含特殊的字符就不會被顯示爲 
  時間格式啦: 
  FormatdateTime('"today is" c',now); 
  輸出爲:today is 2004-8-7 10:26:58 
  時間中也可以加"-"或""來分開日期: 
  FormatdateTime('"today is" yy-mm-dd',now); 
  FormatdateTime('"today is" yymmdd',now); 
  輸出爲: today is 04-08-07 
  也可以用":"來分開時間 
  FormatdateTime('"today is" hh:nn:ss',now); 
  輸出爲:today is 10:32:23 
  
  ///////////////////////////////////////////////////////////////// 
  三.FormatFloat的用法 
  常用的聲明: 
  function FormatFloat(const Format: string; Value: Extended): string; overload; 
  和上面一樣Format參數爲格式化指令字符,Value爲Extended類型 
  爲什麼是這個類型,因爲它是所有浮點值中表示範圍最大的,如果傳入該方法的參數 
  比如Double或者其他,則可以保存不會超出範圍。 
  關鍵是看Format參數的用法 
  0 這個指定相應的位數的指令。 
  比如:FormatFloat('000.000',22.22); 
  輸出的就是022.220 
  注意一點,如果整數部分的0的個數小於Value參數中整數的位數,則沒有效果 
  如:FormatFloat('0.00',22.22); 
  輸出的是:22.22 
  但如果小數部分的0小於Value中小數的倍數,則會截去相應的小數和位數 
  如:FormatFloat('0.0',22.22); 
  輸出的是:22.2 
  也可以在整數0中指定逗號,這個整數位數必須大於3個,纔會有逗號出句 
  FormatFloat('0,000.0',2222.22); 
  輸出是:2,222.2 
  如果這樣FormatFloat('000,0.0',2222.22); 
  它的輸出還是:2,222.2 
  注意它的規律 
  # 和0的用法一樣,目前我還沒有測出有什麼不同。 
  FormatFloat('##.##',22.22); 
  輸出是:22.00 
  
  E 科學表示法,看幾個例子大概就明白了 
  FormatFloat('0.00E+00',2222.22); 
  輸出是 2.22E+03 
  FormatFloat('0000.00E+00',2222.22); 
  輸出是 2222.22E+00 
  FormatFloat('00.0E+0',2222.22); 
  22.2E+2 
  明白了嗎,全靠E右邊的0來支配的。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

ANSI 和 UNICODE 的函數對應表


ANSI        UNICODE     通用
(char.h)    (wchar.h)        (tchar.h)

char         wchar_t          TCHAR
char *      wchar_t *        PTCHAR (PTSTR,LPWSTR,PWSTR,WCHAR)

printf       wprintf          _tprintf
scanf       wscanf          _tscanf

atoi         _wtoi            _ttoi
atol         _wtol            _ttol
itoa         _itow            _itot
ltoa         _ltow            _ltot

atof         _wtof            _tstof

strlen       wcslen          _tcslen
strcat       wcscat          _tcscat
strcpy      wcscpy         _tcscpy
strcmp     wcscmp        _tcscmp

 

 

 

 

ASCII

UNICODE

TCHAR

VS2005

int

atoi

_wtoi

_tstoi

_ttoi 

_atoi_l

_wtoi_l

long

atol

_wtol

_tstoi

_ttoi

_atoi_l

_wtoi_l

__int64

_atoi64

_wtoi64

_tstoi64

_ttoi64

_atoi64_l

_wtoi64_l

float

 

 

 

_atoflt

_atoflt_l 

double

atof

_wtof

_tstof

_ttof

_atof_l

_wtof_l

_atodbl

_atodbl_l

long double

 

 

 

_atoldbl

_atoldbl_l 

atof, _atof_l, _wtof, _wtof_l

Convert string to float

atoi, _atoi_l, _wtoi, _wtoi_l

Convert string to int

_atoi64, _atoi64_l, _wtoi64, _wtoi64_l

Convert string to __int64

atol, _atol_l, _wtol, _wtol_l

Convert string to long

_ecvt, _ecvt_s

Convert double to string of specified length

_fcvt, _fcvt_s

Convert double to string with specified number of digits following decimal point

_gcvt, _gcvt_s

Convert double number to string; store string in buffer

_itoa, _i64toa, _ui64toa, _itow, _i64tow, _ui64tow, _itoa_s, _i64toa_s, _ui64toa_s, _itow_s, _i64tow_s, _ui64tow_s

Convert int or __int64 to string

_ltoa, _ltow, _ltoa_s, _ltow_s

Convert long to string

strtod, _strtod_l, wcstod, _wcstod_l

Convert string to double

strtol, wcstol, _strtol_l, _wcstol_l

Convert string to long integer

strtoul, _strtoul_l, wcstoul, _wcstoul_l

Convert string to unsigned long integer

_ultoa, _ultow, _ultoa_s, _ultow_s

Convert unsigned long to string

atof, _atof_l, _wtof, _wtof_l

Convert wide-character string to a double

atoi, _atoi_l, _wtoi, _wtoi_l

Convert wide-character string to int

_atoi64, _atoi64_l, _wtoi64, _wtoi64_l

Convert wide-character string to __int64

atol, _atol_l, _wtol, _wtol_l

Convert wide-character string to long

 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

ASSERT()是一個調試程序時經常使用的宏,在程序運行時它計算括號內的表達式,如果表達式爲FALSE  (0),  程序將報告錯誤,並終止執行。如果表達式不爲0,則繼續執行後面的語句。這個宏通常原來判斷程序中是否出現了明顯非法的數據,如果出現了終止程序以免導致嚴重後果,同時也便於查找錯誤。   

ASSERT只有在Debug版本中才有效,如果編譯爲Release版本則被忽略。   
---------------------------------------------------------------   

ASSERT宏定義如下   

#define  ASSERT(f)  /   
do  /   
{  /   
      if  (!(f)  &&  AfxAssertFailedLine(THIS_FILE,  __LINE__))  /   
              AfxDebugBreak();  /   
}  while  (0)  /   

ASSERT(邏輯表達式)   

如果括號中的邏輯表達式值爲假的話,會彈出調試命令窗口,提示具體在哪個文件的哪一行發生了斷言錯誤!   
---------------------------------------------------------------   

ASSERT   
Evaluates  an  expression,  and  displays  a  diagnostic  message  if  the  expression  is  FALSE.  Ignored  in  retail  builds.   

Syntax   

ASSERT(   
      cond   
);   

Parameters   

cond   

Expression  to  evaluate.   

Remarks   

In  debug  builds,  if  the  expression  is  FALSE,  this  macro  displays  a  message  box  with  the  text  of  the  expression,  the  name  of  the  source  file,  and  the  line  number.  The  user  can  ignore  the  assertion,  enter  the  debugger,  or  quit  the  application.   

Example   

ASSERT(rtStartTime  <=  rtEndTime);   


---------------------------------------------------------------   

斷言(ASSERT)的使用,方法很簡單。爲什麼要用,初學者可能比較迷惑。   
契約式編程講的比較清楚,建議可以先看看這類書。   
一個函數由前置條件、後置條件和不變式組成。在VC中,我們可以通過斷言來保證這三個條件。可以大大提高了軟件的質量。   
---------------------------------------------------------------   

如果ASSERT()中的條件不成立(比如  ASSERT(0)  ;    ),會彈出一個比較嚇人的對話框。   

點擊重試,可以到達  ASSERT  斷言不成立的那一行,   

此時可以在watch窗口查看變量值,找出出錯的原因。   

如果程序能夠繼續運行,可以按F5繼續調試。   

發佈了84 篇原創文章 · 獲贊 14 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章