小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

VC 強(qiáng)制類型轉(zhuǎn)換

 牛人的尾巴 2017-01-14

以下是一些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ù)。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多