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...