以下是一些VC下的強(qiáng)制類型轉(zhuǎn)換的函數(shù)
一、字符串轉(zhuǎn)換
1.CString 轉(zhuǎn)化為整形Int
 CString str=_T("12345");
 atoi((LPCSTR)str);//用LPCSTR轉(zhuǎn)化為const char*即可
 CString str="1";
 int n=atoi(str.GetBuffer(0));
2.將一個CString轉(zhuǎn)到一個char的數(shù)組(char*)中
 char buffer[128]
 CString str;
 a.//strcpy方法
 strcpy(buffer,str.GetBuffer());
 str.ReleaseBuffer();
 b.//強(qiáng)制轉(zhuǎn)化方法
 buffer=(LPTSTR)(LPCTSTR)str;
 c.//sprintf方法
 sprintf(buffer,"%s",str);
 d.
 CString str;
 int nLength=str.GetLength();
 char * sz=new char[nLength];
 sz=str.GetBuffer(0);
 (LPCSTR)CString
 e.經(jīng)過類型強(qiáng)制轉(zhuǎn)換,可以將CString類型轉(zhuǎn)換成char*,例如:
 CString cStr = "Hello,world!";
 char* zStr = (char*)(LPCTSTR)cStr;
3.int 轉(zhuǎn) cstring
 CString string;
 int iValue=100;
 string.Format(_T("%d"),iValue);
 MessageBox(string);
 string的值為"100"
4.char * 轉(zhuǎn) CString
 a.
 char sz[128];
 CString str;
 str.Format("%s",sz);
 b.
 CString.format("%s", char*); 
 CString strtest; 
 char * charpoint; 
 charpoint="give string a value"; 
 strtest=charpoint; //直接付值
 c.
 char*類型可以直接給CString,完成自動轉(zhuǎn)換,例如:
 char* zStr = "Hello,world!";
 CString cStr = zStr;
5.Float 轉(zhuǎn) CString
 float f=0.0;
 CString str;
 str.Format("%f",f);
6.CString 轉(zhuǎn) Float
 CString str="0.0";
 float f=atof(str.GetBuffer(0));
7.string 轉(zhuǎn) CString 
 CString.format("%s", string.c_str()); 
 用c_str()確實比data()要好.
8.char* 轉(zhuǎn) int
 #include <stdlib.h>
 int atoi(const char *nptr);
 long atol(const char *nptr);
 long long atoll(const char *nptr);
 long long atoq(const char *nptr);
9.CString 轉(zhuǎn) string
 string s(CString.GetBuffer()); 
 GetBuffer()后一定要ReleaseBuffer(),否則就沒有釋放緩沖區(qū)所占的空間.
10.int 轉(zhuǎn) char *
 在stdlib.h中有個函數(shù)itoa()
 itoa的用法:
 itoa(i,num,10);
 i 需要轉(zhuǎn)換成字符的數(shù)字
 num 轉(zhuǎn)換后保存字符的變量
 10 轉(zhuǎn)換數(shù)字的基數(shù)(進(jìn)制)10就是說按照10進(jìn)制轉(zhuǎn)換數(shù)字。還可以是2,8,16等等你喜歡的進(jìn)制類型
 原形:char *itoa(int value, char* string, int radix);
 實例:
 #include "stdlib.h"
 #include "stdio.h"
 main()
 {
 int i=1234;
 char s[5];
 itoa(i,s,10);
 printf("%s",s);
 getchar();
 }
11.string 轉(zhuǎn) char * 
 char *p = string.c_str(); 
 string aa("aaa");
 char *c=aa.c_str();
 string mngName;
 char t[200];
 memset(t,0,200);
 strcpy(t,mngName.c_str());
12、CString to LPCSTR
 將CString轉(zhuǎn)換成LPCSTR,需要獲得CString的長度,例如:
 CString cStr = _T("Hello,world!");
 int nLen = cStr.GetLength();
 LPCSTR lpszBuf = cStr.GetBuffer(nLen);
13、CString to LPSTR
 這個和第3個技巧是一樣的,例如:
 CString cStr = _T("Hello,world!");
 int nLen = str.GetLength();
 LPSTR lpszBuf = str.GetBuffer(nLen);
14、Char[] to int
 將字符串類型轉(zhuǎn)換成整數(shù)型,可以使用atoi函數(shù),例如:
 char c[10];
 int n;
 n = atoi(c);
15、Char[] to float
 和第5個技巧一樣,使用atof()函數(shù)可以轉(zhuǎn)換成float型,例如:
 char c[10];
 float f;
 f = atof(c);
16、Char* to int
 char *str = "100";
 int i;
 i = atoi(str);
一、其它數(shù)據(jù)類型轉(zhuǎn)換為字符串
短整型(int)
itoa(i,temp,10);///將i轉(zhuǎn)換為字符串放入temp中,最后一個數(shù)字表示十進(jìn)制
itoa(i,temp,2); ///按二進(jìn)制方式轉(zhuǎn)換
長整型(long)
ltoa(l,temp,10);
二、從其它包含字符串的變量中獲取指向該字符串的指針
CString變量
str = "2008北京奧運(yùn)";
buf = (LPSTR)(LPCTSTR)str;
BSTR類型的_variant_t變量
v1 = (_bstr_t)"程序員";
buf = _com_util::ConvertBSTRToString((_bstr_t)v1);
三、字符串轉(zhuǎn)換為其它數(shù)據(jù)類型
strcpy(temp,"123");
短整型(int)
i = atoi(temp);
長整型(long)
l = atol(temp);
浮點(diǎn)(double)
d = atof(temp);
四、其它數(shù)據(jù)類型轉(zhuǎn)換到CString
使用CString的成員函數(shù)Format來轉(zhuǎn)換,例如:
整數(shù)(int)
str.Format("%d",i);
浮點(diǎn)數(shù)(float)
str.Format("%f",i);
字符串指針(char *)等已經(jīng)被CString構(gòu)造函數(shù)支持的數(shù)據(jù)類型可以直接賦值
str = username;
五、BSTR、_bstr_t與CComBSTR
CComBSTR、_bstr_t是對BSTR的封裝,BSTR是指向字符串的32位指針。
char *轉(zhuǎn)換到BSTR可以這樣: BSTR b=_com_util::ConvertStringToBSTR("數(shù)據(jù)");///使用前需要加上頭文件comutil.h
反之可以使用char *p=_com_util::ConvertBSTRToString(b);
六、VARIANT 、_variant_t 與 COleVariant
VARIANT的結(jié)構(gòu)可以參考頭文件VC98\Include\OAIDL.H中關(guān)于結(jié)構(gòu)體tagVARIANT的定義。
對于VARIANT變量的賦值:首先給vt成員賦值,指明數(shù)據(jù)類型,再對聯(lián)合結(jié)構(gòu)中相同數(shù)據(jù)類型的變量賦值,舉個例子:
VARIANT va;
int a=2001;
va.vt=VT_I4;///指明整型數(shù)據(jù)
va.lVal=a; ///賦值
對于不馬上賦值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);進(jìn)行初始化,其本質(zhì)是將vt設(shè)置為VT_EMPTY,下表我們列舉vt與常用數(shù)據(jù)的對應(yīng)關(guān)系:
unsigned char bVal; VT_UI1
short iVal; VT_I2
long lVal; VT_I4
float fltVal; VT_R4
double dblVal; VT_R8
VARIANT_BOOL boolVal; VT_BOOL
SCODE scode; VT_ERROR
CY cyVal; VT_CY
DATE date; VT_DATE
BSTR bstrVal; VT_BSTR
IUnknown FAR* punkVal; VT_UNKNOWN
IDispatch FAR* pdispVal; VT_DISPATCH
SAFEARRAY FAR* parray; VT_ARRAY|*
unsigned char FAR* pbVal; VT_BYREF|VT_UI1
short FAR* piVal; VT_BYREF|VT_I2
long FAR* plVal; VT_BYREF|VT_I4
float FAR* pfltVal; VT_BYREF|VT_R4
double FAR* pdblVal; VT_BYREF|VT_R8
VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOL
SCODE FAR* pscode; VT_BYREF|VT_ERROR
CY FAR* pcyVal; VT_BYREF|VT_CY
DATE FAR* pdate; VT_BYREF|VT_DATE
BSTR FAR* pbstrVal; VT_BYREF|VT_BSTR
IUnknown FAR* FAR* ppunkVal; VT_BYREF|VT_UNKNOWN
IDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCH
SAFEARRAY FAR* FAR* pparray; VT_ARRAY|*
VARIANT FAR* pvarVal; VT_BYREF|VT_VARIANT
void FAR* byref; VT_BYREF
_variant_t是VARIANT的封裝類,其賦值可以使用強(qiáng)制類型轉(zhuǎn)換,其構(gòu)造函數(shù)會自動處理這些數(shù)據(jù)類型。
例如:
long l=222;
ing i=100;
_variant_t lVal(l);
lVal = (long)i;
COleVariant的使用與_variant_t的方法基本一樣,請參考如下例子:
COleVariant v3 = "字符串", v4 = (long)1999;
CString str =(BSTR)v3.pbstrVal;
long i = v4.lVal;
七、其它
對消息的處理中我們經(jīng)常需要將WPARAM或LPARAM等32位數(shù)據(jù)(DWORD)分解成兩個16位數(shù)據(jù)(WORD),例如:
LPARAM lParam;
WORD loValue = LOWORD(lParam);///取低16位
WORD hiValue = HIWORD(lParam);///取高16位
對于16位的數(shù)據(jù)(WORD)我們可以用同樣的方法分解成高低兩個8位數(shù)據(jù)(BYTE),例如:
WORD wValue;
BYTE loValue = LOBYTE(wValue);///取低8位
BYTE hiValue = HIBYTE(wValue);///取高8位
后記:本文匆匆寫成,錯誤之處在所難免,歡迎來信指正。
int ->str itoa,atoi
double- str ftoa,atof
_bstr_t,_variant_t,CString,long 等等看看下面:
我給你點(diǎn)詳細(xì)的例子,看下面
先看懂_variant_t與_bstr_t這兩個類的構(gòu)造函數(shù)和 operator=
里面有重載了很多情況,
其他類型向_variant_t 賦值:
_variant_t( ) throw( );
_variant_t( const VARIANT& varSrc ) throw( _com_error );
_variant_t( const VARIANT* pVarSrc ) throw( _com_error );
_variant_t( const _variant_t& var_t_Src ) throw( _com_error );
_variant_t( VARIANT& varSrc, bool fCopy ) throw( _com_error );
_variant_t( short sSrc, VARTYPE vtSrc = VT_I2 ) throw( _com_error );
_variant_t( long lSrc, VARTYPE vtSrc = VT_I4 ) throw( _com_error );
_variant_t( float fltSrc ) throw( );
_variant_t( double dblSrc, VARTYPE vtSrc = VT_R8 ) throw( _com_error );
_variant_t( const CY& cySrc ) throw( );
_variant_t( const _bstr_t& bstrSrc ) throw( _com_error );
_variant_t( const wchar_t *wstrSrc ) throw( _com_error );
_variant_t( const char* strSrc ) throw( _com_error );
_variant_t( bool bSrc ) throw( );
_variant_t( IUnknown* pIUknownSrc, bool fAddRef = true ) throw( );
_variant_t( IDispatch* pDispSrc, bool fAddRef = true ) throw( );
_variant_t( const DECIMAL& decSrc ) throw( );
_variant_t( BYTE bSrc ) throw( );
operator=的重載形式:
_variant_t& operator=( const VARIANT& varSrc ) throw( _com_error );
_variant_t& operator=( const VARIANT* pVarSrc ) throw( _com_error );
_variant_t& operator=( const _variant_t& var_t_Src ) throw( _com_error );
_variant_t& operator=( short sSrc ) throw( _com_error );
_variant_t& operator=( long lSrc ) throw( _com_error );
_variant_t& operator=( float fltSrc ) throw( _com_error );
_variant_t& operator=( double dblSrc ) throw( _com_error );
_variant_t& operator=( const CY& cySrc ) throw( _com_error );
_variant_t& operator=( const _bstr_t& bstrSrc ) throw( _com_error );
_variant_t& operator=( const wchar_t* wstrSrc ) throw( _com_error );
_variant_t& operator=( const char* strSrc ) throw( _com_error );
_variant_t& operator=( IDispatch* pDispSrc ) throw( _com_error );
_variant_t& operator=( bool bSrc ) throw( _com_error );
_variant_t& operator=( IUnknown* pSrc ) throw( _com_error );
_variant_t& operator=( const DECIMAL& decSrc ) throw( _com_error );
_variant_t& operator=( BYTE bSrc ) throw( _com_error );
有了以上兩個函數(shù),舉個例子:
double f=1.0
_variant_t v;
v=f; //是合法的看看operator=的重載形式就知道了
CString str="ddd"
_variant_t v;
v=str.AllocSysString() 或者v=(_bstr_t)(char*)str;
即可
_variant_t轉(zhuǎn)換成別的形式
你首先必須確定你要轉(zhuǎn)化成什么樣的形式
double f;
_variant_t v
f=v.dblVal 即可或者f=(double)v;也可以
附:_variant_t的操作符
operator short( ) const throw( _com_error );
operator long( ) const throw( _com_error);
operator float( ) const throw( _com_error );
operator double( ) const throw( _com_error );
operator CY( ) const throw( _com_error );
operator bool( ) const throw( _com_error );
operator DECIMAL( ) const throw( _com_error );
operator BYTE( ) const throw( _com_error );
operator _bstr_t( ) const throw( _com_error );
operator IDispatch*( ) const throw( _com_error );
operator IUnknown*( ) const throw( _com_error );
1 string 2 CString 
 CString.format("%s",string.c_str());
2 CString 2 string
string str(CString.GetBuffer(str.GetLength()));
3 string 2 char *
char *p=string.c_str();
4 char * 2 string
string str(char*);
5 CString 2 char *
strcpy(char,CString,sizeof(char));
6 char * 2 CString
CString.format("%s",char*);
CString的format方法是非常好用的。string的c_str()也是非常常用的,但要注意和char *轉(zhuǎn)換時,要把char定義成為const char*,這樣是最安全的。
************************************************************************************************
1. char* to string
string s(char *); 
注:在不是初始化的地方最好用assign().
?。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。?!
2. string to const char*
string a="strte";
const char* r=a.c_str();
注意是const的。還要轉(zhuǎn)到char*:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2.2. const char* to char*
const char* r="123";
char *p1 = new char[strlen(r)+1];
strcpy(p1,r);
附:http://hi.baidu.com/cfans/blog/item/06970ef4b671f366dcc4745d.html
這個頁面是具體講述區(qū)別的。
··············································································
·······························
3. cstring to string
vs2005 Unicode下:
 CStringW str(L"test"); 
 CStringA stra(str.GetBuffer(0)); 
 str.ReleaseBuffer(); 
 std::string strs (stra.GetBuffer(0)); 
 stra.ReleaseBuffer();
非Unicode下:
CString cs("test");
std::string str=cs.getBuffer(0);
cs.ReleaseBuffer();
注:GetBuffer()后一定要ReleaseBuffer(),否則就沒有釋放緩沖區(qū)所占的空間.
++++++++++++++++++++++++++++++++++++++++++++++++++++
4. double ,int to string
#include <sstream>
using namespace std;
stringstream ss;
string result;
long n=11111;
stream << n; //從long型數(shù)據(jù)輸入
stream >>result; //轉(zhuǎn)換為 string
===================================================
5.char* to int, double ,long
char *s; double x; int i; long l;
s = " -2309.12E-15";
x = atof( s );
printf( "atof test: ASCII string: %s\tfloat: %e\n", s, x );
s = "7.8912654773d210";
x = atof( s );
printf( "atof test: ASCII string: %s\tfloat: %e\n", s, x );
s = " -9885 pigs";
i = atoi( s );
printf( "atoi test: ASCII string: %s\t\tinteger: %d\n", s, i );
s = "98854 dollars";
l = atol( s );
printf( "atol test: ASCII string: %s\t\tlong: %ld\n", s, l );
------------------------------------------------------------------------------------------------
6. string to int ,long ,double 
 int
 s;
string str="123";
stringstream ss;
ss<<str;//從str輸入
ss>>s;//輸出到int
ss.clear();
——————————————————————————————————————————
7. date to string
#include <time>
using namespace std;
char dateStr [9];
char timeStr [9];
_strdate( dateStr);
printf( "The current date is %s \n", dateStr);
_strtime( timeStr );
printf( "The current time is %s \n", timeStr);
--------實踐證明是正確的版本--------------------------------------------------------------
#include <iostream>
#include <ctime>
#include <cerrno>
int main()
{
 //Find the current time
 time_t curtime = time(0);
 
 //convert it to tm
 tm now=*localtime(&curtime);
 
 //BUFSIZ is standard macro that expands to a integer constant expression_r
 //that is greater then or equal to 256. It is the size of the stream buffer
 //used by setbuf()
 char dest[BUFSIZ]={0};
 
 //Format string determines the conversion specification's behaviour
 const char format[]="%A, %B %d %Y. The time is %X";
 
 //strftime - converts date and time to a string
 if (strftime(dest, sizeof(dest)-1, format, &now)>0)
 std::cout<<dest<<std::endl;
 else
 std::cerr<<"strftime failed. Errno code: "<<errno<<std::endl;
}
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
8.string to cstring
+++++++++++++++++++++++++++++++++++++++++++++++++++++
非Unicode下:
int 轉(zhuǎn) CString:
CString.Format("%d",int);
...............................
string 轉(zhuǎn) CString 
CString.format("%s", string.c_str()); 
用c_str()確實比data()要好. 
.......................................
char* 轉(zhuǎn) CString 
CString.format("%s", char*); 
CString strtest; 
char * charpoint; 
charpoint="give string a value"; 
strtest=charpoint; //直接付值
.....................................................
CString 轉(zhuǎn) int
CString ss="1212.12"; 
int temp=atoi(ss); //atoi _atoi64或atol
...................................................................................................................................
9.在Unicode下的CString to double
CSting sTemp("123.567");
double dTemp = _wtof(sTemp.GetString());
二、數(shù)值處理
1、浮點(diǎn)數(shù)取整方法
 a、直接賦值給整數(shù)變量。如:
 int i = 2.5; 或 i = (int)2.5; 這種方法采用的是四舍五入。
 b、使 用 floor函 數(shù) 。 floor(x)返回的是x的整數(shù)部分。如:
 floor(2.5) = 2
 floor(-2.5) = -2
 c、使用ceil函數(shù)。ceil(x)返回的是不大于x的最小整數(shù)。如 :
 ceil(2.5) = 2
 ceil(-2.5) = -3
 d、求余數(shù)%,fmod函數(shù)。
 8 % 3 = 2
 fmod(8.1,3) = 2.1。適用于浮點(diǎn)數(shù)。