以下是一些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北京奧運";
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);
浮點(double)
d = atof(temp);
四、其它數(shù)據(jù)類型轉(zhuǎn)換到CString
使用CString的成員函數(shù)Format來轉(zhuǎn)換,例如:
整數(shù)(int)
str.Format("%d",i);
浮點數(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 等等看看下面:
我給你點詳細(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().
!?。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。?br>
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、浮點數(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。適用于浮點數(shù)。