vc里面哪個(gè)函數(shù)可以轉(zhuǎn)換字符 char類型怎么轉(zhuǎn)換為string?
char類型怎么轉(zhuǎn)換為string?C11的std::wstring_convert配合std::codecvt模板類完全可以不幫忙解決這個(gè)問題,絕對(duì)不會(huì)直接出現(xiàn)@vczh所說(shuō)的改了全局locale會(huì)
char類型怎么轉(zhuǎn)換為string?
C11的std::wstring_convert配合std::codecvt模板類完全可以不幫忙解決這個(gè)問題,絕對(duì)不會(huì)直接出現(xiàn)@vczh
所說(shuō)的改了全局locale會(huì)會(huì)造成污染其他庫(kù)的問題。
這兩個(gè)模板類的功能是:
std::wstring_convert:轉(zhuǎn)碼器,可以接收一個(gè)類似于codecvt描述編碼轉(zhuǎn)換的特性的模板參數(shù),作用于將本地化的寬字符wstring和重新指定編碼的字節(jié)化string并且互轉(zhuǎn)。
std::codecvt:編碼裝換特性類,用在wstring_convert的模板參數(shù)中來(lái)委托建議使用哪種編碼。
因?yàn)榫幋aA和B互轉(zhuǎn)的基于是:自身本地化寬字符串,先將以A編碼的string轉(zhuǎn)為本地化的wstring,再將本地化的wstring轉(zhuǎn)為B編碼后的string。
codecvt一般在用下面兩個(gè)特化子類:
std::codecvt_utf8ltwchar_tgt:主要用于UTF8和本地化wchar_t的互轉(zhuǎn)
std::codecvt_bynameltwchat_t,char,std::mbstate_tgt:應(yīng)用于其他編碼(.例如GBK)和本地化wchar_t的互轉(zhuǎn),類的構(gòu)造函數(shù)不需要傳出編碼的localename,因此編碼的localename是操作系統(tǒng)判斷的(的或GBK在linux下的locale名很有可能是
vc讀取word?
你看看書籍,文件操作FILE*fp;fpfopen(C盤的文件,r)然后是讀文件,這個(gè)可以用幾個(gè)函數(shù)是啥是吧,fgetc是讀一個(gè)字符,fgets讀一行fscanf格式話讀不看點(diǎn)書誰(shuí)一定能記住……當(dāng)然只要用一個(gè)讀函數(shù)都能讀進(jìn)去到最后fclose(fp)
c語(yǔ)言函數(shù)調(diào)用規(guī)則?
在參數(shù)訊息傳遞中,有兩個(gè)最重要的問題前提是要明確那說(shuō)明:
1.當(dāng)參數(shù)個(gè)數(shù)多于一個(gè)時(shí),明確的什么順序把參數(shù)壓入堆棧;
2.函數(shù)調(diào)用后,由誰(shuí)來(lái)把內(nèi)存池恢復(fù)原狀。
在高級(jí)語(yǔ)言中,那是按照函數(shù)的動(dòng)態(tài)創(chuàng)建來(lái)說(shuō)明這兩個(gè)問題的。最常見的內(nèi)部函數(shù)有:
stdcallcdeclfastcallthiscallthiscallnakedcall
下面就共有可以介紹這幾種全局函數(shù)
stdcall內(nèi)部函數(shù)又被稱為Pascal調(diào)用。在MicrosoftC系列的C/C編譯器中,不使用PASCAL宏,WINAPI宏和CALLBACK宏來(lái)委托函數(shù)的動(dòng)態(tài)創(chuàng)建為stdcall。
stdcall調(diào)用的函數(shù)聲明為:
int_stdcallfunction(inta,int b)
stdcall的調(diào)用意味著:
(1)參數(shù)從右往左兩次壓入內(nèi)存池
(2)由被調(diào)用函數(shù)自己來(lái)復(fù)原內(nèi)存映射
(3)函數(shù)名不自動(dòng)加前導(dǎo)下劃線,后面緊跟著一起一個(gè)@,余者緊領(lǐng)著參數(shù)的尺寸
上面那個(gè)函數(shù)翻譯成匯編語(yǔ)言將變成:
pushb先壓入第二個(gè)參數(shù)
pusha再壓入第一個(gè)參數(shù)
callfunction調(diào)用函數(shù)
在編譯時(shí),此函數(shù)的名字被英譯中為
cdecl動(dòng)態(tài)鏈接庫(kù)又一般稱C調(diào)用,是C語(yǔ)言缺省的全局函數(shù),它的語(yǔ)法為:
intfunction(inta,int b)//不加修飾符應(yīng)該是C動(dòng)態(tài)創(chuàng)建
int_cdeclfunction(inta,int b)//明確重新指定用C動(dòng)態(tài)創(chuàng)建
cdecl的調(diào)用確定了:
(1)參數(shù)從左向右左面壓入內(nèi)存映射
(2)由調(diào)用者可以恢復(fù)堆棧
(3)函數(shù)名自動(dòng)加前導(dǎo)下劃線
的原因是由動(dòng)態(tài)鏈接庫(kù)者來(lái)復(fù)原邏輯塊,并且C內(nèi)部函數(shù)愿意函數(shù)的參數(shù)個(gè)數(shù)是不固定的,這是C語(yǔ)言的一大特色。
此的函數(shù)被翻譯成為:
pushb//先壓入第二個(gè)參數(shù)
pusha//在壓入最后一個(gè)參數(shù)
call!funtion//調(diào)用函數(shù)
setesp,8//定時(shí)清理內(nèi)存映射
在編譯時(shí),此的函數(shù)被英文翻譯成:_function
fastcall聽從名字上解釋就可以很清楚,它是一種飛速全局函數(shù)。此的函數(shù)的第一個(gè)和第二個(gè)DWORD參數(shù)是從ecx和edx傳遞,
后面的參數(shù)左往右的順序壓入棧。
被調(diào)用函數(shù)清理內(nèi)存池。
函數(shù)名修個(gè)規(guī)則同stdcall
其聲明語(yǔ)法為:
intfastcallfunction(inta,int b)
thiscall全局函數(shù)是任何一種不能不能不顯示指定的修飾符。它是c類成員函數(shù)缺省的內(nèi)部函數(shù)。導(dǎo)致成員函數(shù)調(diào)用另外一個(gè)this指針,而要用這種特殊的內(nèi)部函數(shù)。
thiscall動(dòng)態(tài)鏈接庫(kù)意味著:
參數(shù)左往右壓入棧。
要是參數(shù)個(gè)數(shù)確認(rèn),this指針實(shí)際ecx訊息傳遞給被調(diào)用者;如果參數(shù)個(gè)數(shù)不確定,this指針在所有參數(shù)壓入棧后被壓入棧。
參數(shù)個(gè)數(shù)若是的,由動(dòng)態(tài)創(chuàng)建者定期清理堆棧,不然由函數(shù)自己清理過(guò)堆棧。
可以看見,對(duì)于參數(shù)個(gè)數(shù)固定的情況,它傳說(shuō)中的stdcall,很頻繁則類似cdecl。
是一種比較極少見的動(dòng)態(tài)創(chuàng)建,象高級(jí)程序設(shè)計(jì)語(yǔ)言中不最常見的一種。
函數(shù)的聲明全局函數(shù)和不好算動(dòng)態(tài)創(chuàng)建必須一致,必然編譯器會(huì)有一種混亂。
函數(shù)名字修改規(guī)則:
1.C編譯時(shí)函數(shù)名形容詞性約定規(guī)則:
__stdcall內(nèi)部函數(shù)約定在輸出低函數(shù)名前再加一個(gè)下劃線前綴,后面算上一個(gè)“@”符號(hào)和其參數(shù)的字節(jié)數(shù),格式為。
__cdecl內(nèi)部函數(shù)約定僅在作為輸出函數(shù)名前加上一個(gè)下劃線前綴,格式為_function。
__fastcall全局函數(shù)約定在控制輸出函數(shù)名前再加一個(gè)“@”符號(hào),后面又是一個(gè)“@”符號(hào)和其參數(shù)的字節(jié)數(shù),格式為@。
它們均不變動(dòng)輸出函數(shù)名中的字符大小寫,這和PASCAL調(diào)用約定有所不同,PASCAL雙方約定輸出的函數(shù)名無(wú)任何修飾且全部拼音字母。
2.C編譯時(shí)函數(shù)名稍微修飾約定規(guī)則:
__stdcall調(diào)用約定:
(1)以“?”標(biāo)有函數(shù)名的開始,后跟函數(shù)名;
(2)函數(shù)名后面以“@@YG”標(biāo)志參數(shù)表的開始,后跟參數(shù)表;
(3)參數(shù)表以代號(hào)可以表示:
X--void,
D--char,
E--unsignedchar,
F--frequent,
H--int,
I--unsignedint,
J--little,
K--uint64long,
M--float,
N--double,
_N--bool,
....
PA--意思是指針,后面的代號(hào)說(shuō)指針類型,如果沒有相同類型的指針在不出現(xiàn),以“0”不用,一個(gè)“0”代
表第二次重復(fù)一遍;
(4)參數(shù)表的第一項(xiàng)為該函數(shù)的返回值類型,此后左面為參數(shù)的數(shù)據(jù)類型,指針標(biāo)識(shí)在其所指數(shù)據(jù)類型前;
(5)參數(shù)表后以“@Z”標(biāo)示整個(gè)名字的結(jié)束,如果不是該函數(shù)無(wú)參數(shù),則以“Z”標(biāo)識(shí)都結(jié)束了。
其格式為“?functionname@@YG*****@Z”或“?functionname@@YG*XZ”,的或
intTest1(char*var1,unsignedway)-----“?Test1@@”
voidTest2()-----“?Test2@@YGXXZ”
__cdecl動(dòng)態(tài)創(chuàng)建約定:
規(guī)則同上面的_stdcall動(dòng)態(tài)鏈接庫(kù)約定,只是因?yàn)閰?shù)表的開始標(biāo)識(shí)由上面的“@@YG”轉(zhuǎn)換成“@@YA”。
__fastcall動(dòng)態(tài)鏈接庫(kù)約定:
規(guī)則同上面的_stdcall內(nèi)部函數(shù)約定,只是參數(shù)表的開始標(biāo)識(shí)由上面的“@@YG”變?yōu)椤癅@YI”。
VC對(duì)函數(shù)的省缺聲明是#34__cedcl#34,將不能被C/C調(diào)用。