VC中的字串表示方法

2021-06-21 09:46:24 字數 3284 閱讀 9923

1.

2.首先,因為c++支援兩種字串,即常規的

ansi

編碼(使用""包裹)和

unicode

編碼(使用l""包裹),這樣對應的就有了兩套字串處理函式,比如:strlen和wcslen,分別用於處理兩種字串。

(a)char是單位元組字元變數,指向ansi字元陣列的指標,其中每個字元佔據8位(有效資料是除掉最高位的其他7位)。對於不同語言,例如中文等表示能力弱;

(b)wchar_t是寬位元組變數型別,指向unicode字元,一般為16位或32位,但不同的c或c++庫有不同的規定,如gnu libc規定wchar_t為32位

。總之,wchar所能表示的

字元數遠超char型。

(c)tchar根據工程字元編譯而定:

程式編譯為 ansi, tchar 就是相當於 char;

當程式編譯為 unicode, tchar 就相當於 wchar。

為了讓編譯器識別unicode字串,必須以在前面加乙個「l」,定義寬位元組型別方法如下:

wchar_t c = `a' ; 

wchar_t * p = l"hello!" ; 

wchar_t a = l"hello!" ;

其中,寬位元組型別每個變數占用2個位元組,故上述陣列a的sizeof(a) = 14。

_t巨集可以把乙個引號引起來的字串,根據你的環境設定,使得編譯器會根據編譯目標環境選擇合適的(unicode還是ansi)字元處理方式。

如果你定義了unicode,那麼_t巨集會把字串前面加乙個l。這時 _t("abcd") 相當於 l"abcd" ,這是寬字串.

如果沒有定義,那麼_t巨集不會在字串前面加那個l,_t("abcd") 就等價於 "abcd"。

(d)lp的含義是長指標(long pointer)。lpstr是乙個指向以『/0』結尾的ansi字元陣列的指標,與char*可以互換使用,在win32中較多地使用lpstr(並且長指標(lp)和短指標(p)是等價的)。而lpcstr中增加的『c』的含義是「constant」(常量),表明這種資料型別的例項不能被使用它的api函式改變,除此之外,它與lpstr是等同的。

(e)lptstr和lpctstr。我們知道tchar在採用unicode方式編譯時是wchar_t,在普通時編譯成char,業界推出的unicode標準,它提供了一種簡單和一致的表達字串的方法,所有字元中的位元組都是16位的值,其數量也可以滿足差不多世界上所有書面語言字元的編碼需求,開發程式時使用unicode(型別為wchar_t)是一種被鼓勵的做法。lpwstr與lpcwstr由此產生,它們的含義類似於lpstr與lpcstr,只是字元資料是16位的wchar_t而不是char.然後為了實現兩種編碼的通用,提出了tchar的定義:

如果定義_unicode,宣告如下:typedef wchar_t tchar;

如果沒有定義_unicode,則宣告如下:typedef char tchar;

lptstr和lpctstr中的含義就是每個字元是這樣的tchar。

(f)cstring類中的字元就是被宣告為tchar型別的,它提供了乙個封裝好的類供使用者方便地使用。

lpctstr:

#ifdef _unicode

typedef const wchar_t * lpctstr;

#else

typedef const char * lpctstr;

#endif

附註1:

如果使用vs2005進行專案工程構建,因為vs2005預設使用unicode字元,所以不能使用char,而應該用tchar。因此,需要設定該工程屬性:project->properties->configurationsproperties -> general ->project defaults -> charater set中將unicode字符集改為未設定即可。

附註2:各種字元之間的轉換

1,string -> cstring  

cstring.format("%s", string.c_str());  用c_str()確實比data()要好.  

2,char -> string  

string s(char *);  你的只能初始化,在不是初始化的地方最好還是用assign().  

3,cstring -> string  

string s(cstring.getbuffer()); getbuffer()後一定要releasebuffer(),否則就沒有釋放緩衝區所佔的空間.   

有三個函式可以將字串的內容轉換為字元陣列和cstring:

1.data(),返回沒有」\0「的字串陣列  

2,c_str(),返回有」\0「的字串陣列  

3,copy()   

4、int轉為cstring  

而將數字轉換為cstring變數,可以使用cstring的format函式。如  cstring s;  int i = 64;  

s.format("%d", i)  

數字->字串除了用cstring::format,還有formatv、sprintf和不需要借助於afx的itoa 

5、cstring轉換 char[100]  char a[100];  

cstring str("aaaaaa");  

strncpy(a,(lpctstr)str,sizeof(a)); format函式的功能很強,值得你研究一下。 

6、cstring型別的轉換成int 

cstring型別的轉換成int :     將字元轉換為整數,可以使用atoi、_atoi64或atol。  

//cstring aaa = "16"   

//int int_chage = atoi((lpcstr)aaa)  

7、string轉成」const char *」 string aa("aaa");  

const char *c=aa.c_str(); 

8、string轉成」 char *」 

要用strcpy(),不能用string.c_str() string mngname;  

char t[200]; memset(t,0,200); strcpy(t,mngname.c_str()); 

9、 char*轉為int  #include

int atoi(const char *nptr);  long atol(const char *nptr);  

long long atoll(const char *nptr);  long long atoq(const char *nptr);

字串 表示數值的字串

題目描述 實現乙個函式用來判斷字串是否表示數值 包括整數和小數以及使用科學計數法表示的數 分析 表示數值的字串的規則有 第乙個字元只能是 以及數字 數字字元後面只能接 或 e e 小數點後面必須要有字元且只能接數字字元或 e e e e 後面必須要接字元且只能接數字字元或者 後面必須要接數字字元 b...

表示數值的字串(字串)

題目描述 請實現乙個函式用來判斷字串是否表示數值 包括整數和小數 例如,字串 100 5e2 123 3.1416 和 1e 16 都表示數值。但是 12e 1a3.14 1.2.3 5 和 12e 4.3 都不是。思路 1.第乙個數為 或者為 時,跳過。2.對於小數點 小數點只能出現一次 小數點不...

字串 表示數值的字串

此題出自牛客網的劍指offer專題 請實現乙個函式用來判斷字串是否表示數值 包括整數和小數 例如,字串 100 5e2 123 3.1416 和 1e 16 都表示數值。但是 12e 1a3.14 1.2.3 5 和 12e 4.3 都不是。思路一 直接正規表示式擼起 實現 如下 public cl...