CString物件的連線和格式化字串方法

2021-05-22 17:26:29 字數 3165 閱讀 5306

cstring位於標頭檔案afx.h中。

cstring 是一種很有用的資料型別。它們很大程度上簡化了mfc中的許多操作,使得mfc在做字串操作的時候方便了很多。不管怎樣,使用cstring有很多特殊的技巧,特別是對於純c背景下走出來的程式設計師來說有點難以學習。這篇文章就來討論這些技巧。

使用cstring可以讓你對字串的操作更加直截了當。這篇文章不是cstring的完全手冊,但囊括了大部分常見基本問題。

cstring 物件的連線

格式化字串(包括 int 型轉化為 cstring )

cstring 型轉化成 int 型

cstring 型和 char* 型別的相互轉化

char* 轉化成 cstring

cstring 轉化成 char* 之一:使用lpctstr強制轉化

cstring 轉化成 char* 之二:使用cstring物件的getbuffer方法

cstring 轉化成 char* 之三: 和控制項的介面

cstring 型轉化成 bstr 型;

bstr 型轉化成 cstring 型;

variant 型轉化成 cstring 型;

載入字串表資源;

cstring 和臨時物件;

cstring 的效率;

總結

下面我分別討論。

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

#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++) // 掃瞄**尋找匹配項。

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位的字元哦

當然,也可以使用csting自帶的函式left(),mid(),right().

C string 類和物件 資料的封裝

因為char型別的麻煩,我們可以使用string型別來實現一些功能 include include using namespace std int main string s1 s1為空串 string s2 abc 用字串字面值初始化s2 string s3 s2 將s3初始化為s2的乙個副本 s...

c string類物件的使用

txj.cpp 此檔案包含 main 函式。程式執行將在此處開始並結束。include pch.h include include using namespace std intmain string s2 i love china 2 size length if s2.size 4 string...

CString與各種格式之間的轉換

您好我每次一忘就看這個 1.string 轉 cstring cstring.format s string.c str 2.char 轉 cstring cstring.format s char 3.char to string string s char 4.string 轉 char cha...