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