1、cstring 物件的連線
能體現出 cstring 型別方便性特點的乙個方面就字串的連線,使用 cstring 型別,你能很方便地連線兩個字串,正如下面的例子:
cstring gray("gray");
cstring cat("cat");
cstring graycat = gray + cat;
要比用下面的方法好得多:
char gray = "gray";
char cat = "cat";
char * graycat = malloc(strlen(gray) + strlen(cat) + 1);
strcpy(graycat, gray);
strcat(graycat, cat);
2、格式化字串
與其用 sprintf() 函式或 wsprintf() 函式來格式化乙個字串,還不如用 cstring 物件的format()方法:
cstring s;
s.format(_t("the total is %d"), total);
用這種方法的好處是你不用擔心用來存放格式化後資料的緩衝區是否足夠大,這些工作由cstring類替你完成。
格式化是一種把其它不是字串型別的資料轉化為cstring型別的最常用技巧,比如,把乙個整數轉化成cstring型別,可用如下方法:
cstring s;
s.format(_t("%d"), total);
我總是對我的字串使用_t()巨集,這是為了讓我的**至少有unicode的意識,當然,關於unicode的話題不在這篇文章的討論範圍。_t()巨集在8位字元環境下是如下定義的:
#define _t(x) x // 非unicode版本(non-unicode version)
而在unicode環境下是如下定義的:
#define _t(x) l##x // unicode版本(unicode version)
所以在unicode環境下,它的效果就相當於:
s.format(l"%d", total);
如果你認為你的程式可能在unicode的環境下執行,那麼開始在意用 unicode 編碼。比如說,不要用 sizeof() 操作符來獲得字串的長度,因為在unicode環境下就會有2倍的誤差。我們可以用一些方法來隱藏unicode的一些細節,比如在我需要獲得字元長度的時候,我會用乙個叫做dim的巨集,這個巨集是在我的dim.h檔案中定義的,我會在我寫的所有程式中都包含這個檔案:
#define dim(x) ( sizeof((x)) / sizeof((x)[0]) )
這個巨集不僅可以用來解決unicode的字串長度的問題,也可以用在編譯時定義的**上,它可以獲得**的項數,如下:
class whatever ;
whatever data = ,
...,
};for(int i = 0; i < dim(data); i++) // 掃瞄**尋找匹配項。
這裡要提醒你的就是一定要注意那些在引數中需要真實位元組數的api函式呼叫,如果你傳遞字元個數給它,它將不能正常工作。如下:
tchar data[20];
lstrcpyn(data, longstring, sizeof(data) - 1); // wrong!
lstrcpyn(data, longstring, dim(data) - 1); // right
writefile(f, data, dim(data), &byteswritten, null); // wrong!
writefile(f, data, sizeof(data), &byteswritten, null); // right
造成以上原因是因為lstrcpyn需要乙個字元個數作為引數,但是writefile卻需要位元組數作為引數。
同樣需要注意的是有時候需要寫出資料的所有內容。如果你僅僅只想寫出資料的真實長度,你可能會認為你應該這樣做:
writefile(f, data, lstrlen(data), &byteswritten, null); // wrong
但是在unicode環境下,它不會正常工作。正確的做法應該是這樣:
writefile(f, data, lstrlen(data) * sizeof(tchar), &byteswritten, null); // right
因為writefile需要的是乙個以位元組為單位的長度。(可能有些人會想「在非unicode的環境下執行這行**,就意味著總是在做乙個多餘的乘1操作,這樣不會降低程式的效率嗎?」這種想法是多餘的,你必須要了解編譯器實際上做了什麼,沒有哪乙個c或c++編譯器會把這種無聊的乘1操作留在**中。在unicode環境下執行的時候,你也不必擔心那個乘2操作會降低程式的效率,記住,這只是乙個左移一位的操作而已,編譯器也很樂意為你做這種替換。)
使用_t巨集並不是意味著你已經建立了乙個unicode的程式,你只是建立了乙個有unicode意識的程式而已。如果你在預設的8-bit模式下編譯你的程式的話,得到的將是乙個普通的8-bit的應用程式(這裡的8-bit指的只是8位的字元編碼,並不是指8位的計算機系統);當你在unicode環境下編譯你的程式時,你才會得到乙個unicode的程式。記住,cstring 在 unicode 環境下,裡面包含的可都是16位的字元哦。
3、cstring 型轉化成 int 型
把 cstring 型別的資料轉化成整數型別最簡單的方法就是使用標準的字串到整數轉換例程。
雖然通常你懷疑使用_atoi()函式是乙個好的選擇,它也很少會是乙個正確的選擇。如果你準備使用 unicode 字元,你應該用_ttoi(),它在 ansi 編碼系統中被編譯成_atoi(),而在 unicode 編碼系統中編譯成_wtoi()。你也可以考慮使用_tcstoul()或者_tcstol(),它們都能把字串轉化成任意進製的長整數(如二進位制、八進位制、十進位制或十六進製制),不同點在於前者轉化後的資料是無符號的(unsigned),而後者相反。看下面的例子:
cstring hex = _t("fab");
cstring decimal = _t("4011");
assert(_tcstoul(hex, 0, 16) == _ttoi(decimal));
MFC CString型別轉換 Unicode意識
新手用vs2010編寫乙個mfc工具所遇到的問題。在之前做mfc用的都是用vc6,沒有遇到太多問題,鑑於不太喜歡思考原因,所以一直糊里糊塗的用,現在想想,vc6新建mfc工程時應該預設的是非unicode編碼吧。而vs2010編寫乙個mfc預設的是unicode的編碼。unicode編碼時cstri...
MFC CString 轉換成CHAR陣列
由於結構體中用到聯合體 聯合體需要確定分配記憶體分配大小 或其它因素,需要用char陣列來儲存字串,但是在mfc中一般都是用cstring來存放字條串。關於它們之間的轉換,在vs2008中有時會出現異常情況。在msdn是這樣寫的 cstring orig hello,world convert to...
mysql型別轉換c 型別轉換 C 型別轉換
一 簡介 型別轉換 把資料從一種型別轉換另一種型別 我們要求等號兩邊參與運算子必須型別一致,如果不一致,滿足下列條件會發生自動型別轉換或者隱式型別轉換。1.兩種型別相容 例如 int和double 相容 都是數字型別 2.目標型別大於源型別 double int 顯示型別轉換 1.兩種型別相相容 i...