煩人的型別轉換

2021-05-21 18:17:13 字數 3770 閱讀 8604

一、對有關資料型別轉換的整理

int i = 100;

long l = 2001;

float f=300.2;

double d=12345.119;

char username="程佩君";

char temp[200];

char *buf;

cstring str;

_variant_t v1;

_bstr_t v2;

一、其它資料型別轉換為字串

短整型(int)

itoa(i,temp,10);///將i轉換為字串放入temp中,最後乙個數字表示十進位制

itoa(i,temp,2); ///按二進位制方式轉換

長整型(long)

ltoa(l,temp,10);

浮點數(float,double)

用fcvt可以完成轉換,這是msdn中的例子:

int decimal, sign;

char *buffer;

double source = 3.1415926535;

buffer = _fcvt( source, 7, &decimal, &sign );

執行結果:source: 3.1415926535 buffer: '31415927' decimal: 1 sign: 0

decimal表示小數點的位置,sign表示符號:0為正數,1為負數

cstring變數

str = "2008北京奧運";

buf = (lpstr)(lpctstr)str;

bstr變數

bstr bstrvalue = ::sysallocstring(l"程式設計師");

char * buf = _com_util::convertbstrtostring(bstrvalue);

sysfreestring(bstrvalue);

afxmessagebox(buf);

delete(buf);

ccombstr變數

ccombstr bstrvar("test");

char *buf = _com_util::convertbstrtostring(bstrvar.m_str);

afxmessagebox(buf);

delete(buf);

_bstr_t變數 _bstr_t型別是對bstr的封裝,因為已經過載了=操作符,所以很容易使用

_bstr_t bstrvar("test"); 

const char *buf = bstrvar;///不要修改buf中的內容

afxmessagebox(buf);

通用方法(針對非com資料型別)

一、用sprintf完成轉換

char buffer[200];

char c = '1';

int i = 35;

long j = 1000;

float f = 1.7320534f;

sprintf( buffer, "%c",c);

sprintf( buffer, "%d",i);

sprintf( buffer, "%d",j);

sprintf( buffer, "%f",f);

二、字串轉換為其它資料型別 

strcpy(temp,"123");

短整型(int)

i = atoi(temp);

長整型(long)

l = atol(temp);

浮點(double)

d = atof(temp);

cstring變數

cstring name = temp;

bstr變數

bstr bstrvalue = ::sysallocstring(l"程式設計師");

...///完成對bstrvalue的使用

sysfreestring(bstrvalue);

ccombstr變數 ccombstr型別變數可以直接賦值

ccombstr bstrvar1("test");

ccombstr bstrvar2(temp);

_bstr_t變數 _bstr_t型別的變數可以直接賦值

_bstr_t bstrvar1("test");

_bstr_t bstrvar2(temp);

三、其它資料型別轉換到cstring

使用cstring的成員函式format來轉換,例如:

整數(int)

str.format("%d",i);

浮點數(float)

str.format("%f",i);

字串指標(char *)等已經被cstring建構函式支援的資料型別可以直接賦值

str = username;

對於format所不支援的資料型別,可以通過上面所說的關於其它資料型別轉化到char *的方法先轉到char *,然後賦值給cstring變數。

四、bstr、_bstr_t與ccombstr

ccombstr 是atl對bstr的封裝,_bstr_t是c++對bstr的封裝,bstr是32位指標,但並不直接指向字串的緩衝區。

char *轉換到bstr可以這樣: 

bstr b=_com_util::convertstringtobstr("資料");///使用前需要加上comutil.h和comsupp.lib

sysfreestring(bstrvalue);

反之可以使用

char *p=_com_util::convertbstrtostring(b);

delete p;

具體可以參考一,二段落裡的具體說明。

ccombstr與_bstr_t對大量的操作符進行了過載,可以直接進行=,!=,==等操作,所以使用非常方便。特別是_bstr_t,建議大家使用它。

五、variant 、_variant_t 與 colevariant

variant的結構可以參考標頭檔案vc98/include/oaidl.h中關於結構體tagvariant的定義。對於variant變數的賦值:首先給vt成員賦值,指明資料型別,再對聯合結構中相同資料型別的變數賦值,舉個例子:

variant va;

int a=2001;

va.vt=vt_i4;///指明整型資料

va.lval=a; ///賦值 

_variant_t是variant的封裝類,其賦值可以使用強制型別轉換,其建構函式會自動處理這些資料型別。使用時需加上#include

例如:long l=222;

int 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;

// 本主題演示如何將各種 c++ 字串型別轉換為其他字串。可以轉換的字串型別包括 char *、wchar_t*、_bstr_t、ccombstr、cstring、basic_string 和 system.string。在所有情況下,在將字串轉換為新型別時,都會建立字串的副本。對新字串進行的任何更改都不會影響原始字串,反之亦然。

DayTwentyThree 煩人的筆試

初始資料集的排列順序對演算法的效能無影響的演算法有 選 直接選擇排序 歸 歸併排序 堆 堆排序 影響排序演算法時間複雜度的主要原因是比較的次數 基於比較的排序演算法有 直接插入排序 氣泡排序 簡單選擇排序 希爾排序 快速排序 堆排序歸併排序 基數排序 桶排序都屬於分配式排序,且都是穩定排序演算法比較...

DayTwentyFour 煩人的筆試

resize 方法可以為陣列提前分配大小,但不分配記憶體。當乙個數在一堆數 現的次數大於整體個數的一半時 可以用以下 找出這個數 int morethanhalfnum solution vector int nums return val 構建大根堆和小根堆的 priority queue int...

型別轉換 容器型別之間的轉換

強轉成字串,無非就是在原有的資料的基礎上兩邊套上引號 如果是字串,會把每乙個字元單獨的作為乙個元素放到列表中 如果是字典,只保留鍵,形成一套新的列表 如果是其他的容器,只是單純的在原有資料的基礎上換上 如果是字串,會把每乙個字元單獨的作為乙個元素放到元組中 如果是字典,只保留鍵,形成一套新的元組 如...