C語言字符串
在標(biāo)準(zhǔn)C中,是沒有字符串變量的,但是有字符數(shù)組。而且標(biāo)準(zhǔn)C帶有的標(biāo)準(zhǔn)庫函數(shù):string.h中包含了大量的字符串操作函數(shù),當(dāng)然如果必要的話,你也可以自己寫代碼實(shí)現(xiàn)這些函數(shù)的功能。以下是小編為大家搜索整理的C語言字符串,希望能給大家?guī)韼椭?/p>
對(duì)于32位操作系統(tǒng)
int (2字節(jié)) short (1字節(jié)) long(4字節(jié))
unsigned char 從0到256之間
char 從-128到127之間
byte 字節(jié)就是無符號(hào)的字符
unicode:兩字節(jié)的字符
由此可見:byte=nusigned char, short=char
char* :是指向ANSI字符數(shù)組的指針,其中每個(gè)字符占據(jù)8位(有效數(shù)據(jù)是除掉最高位的其他7位),這里保持了與傳統(tǒng)的C,C++的兼容。
TCHAR: 在采用Unicode方式編譯時(shí)是wchar_t,在普通時(shí)編譯成char. 如果定義_UNICODE,聲明如 :typedef wchar_t TCHAR; 如果沒有定義_UNICODE,則聲明如:typedef char TCHAR;
LPSTR: 是一個(gè)指向以‘’結(jié)尾的ANSI字符數(shù)組的指針,與char*可以互換使用,在win32中較多地使用LPSTR。
LPTSTR和LPCTSTR:中的含義就是每個(gè)字符是這樣的TCHAR。
LPWSTR與LPCWSTR:類似于LPSTR與LPCSTR,只是字符數(shù)據(jù)是16位的wchar_t而不是char。
LPCSTR: 增加的‘C’的含義是“CONSTANT”(常量),表明這種數(shù)據(jù)類型的實(shí)例不能被使用它的API函數(shù)改變,除此之外,它與LPSTR是等同的。
LPCTSTR:
#ifdef _UNICODE
typedef const wchar_t * LPCTSTR;
#else
typedef const char * LPCTSTR;
#endif
CString類, 是由微軟公司集成在VC的MFC里面,包含字符串各種常見操作的類。其源碼可以在MFC里面找到。
當(dāng)聲明一個(gè)字符串變量,首先會(huì)調(diào)用構(gòu)造函數(shù),在成功后,便可利用它的常見操作。
CString 是一個(gè)完全獨(dú)立的類,動(dòng)態(tài)的TCHAR數(shù)組,封裝了 + 等操作符和字符串操作方法。
1、ANSI(即MBCS):為多字節(jié)字符集,它是不定長表示世界文字的編碼方式。
2、Unicode:用兩個(gè)字節(jié)表示一個(gè)字符的編碼方式。
MBCS宏對(duì)應(yīng)的字符串指針為LPSTR,Unicode對(duì)應(yīng)的指針為LPWSTR。LPSTR被定義成是一個(gè)指向以NULL(‘’)結(jié)尾的8位ANSI字符數(shù)組指針,而LPWSTR是一個(gè)指向以NULL結(jié)尾的16位雙字節(jié)字符數(shù)組指針。
為了寫程序的方便,微軟定義了類型LPTSTR,在MBCS下它表示LPSTR,在Unicode下它表示LPWSTR,這就可以重定義一個(gè)宏進(jìn)行不同字符集的轉(zhuǎn)換了。
LP STR:指向一個(gè)字符串的32位指針,每個(gè)字符占1個(gè)字節(jié)。
LPC STR:指向一個(gè)常量字符串的32位指針,每個(gè)字符占1個(gè)字節(jié)。
LP TSTR:指向一個(gè)字符串的32位指針,每個(gè)字符可能占1個(gè)字節(jié)或2個(gè)字節(jié)。
LPC TSTR:指向一個(gè)常量字符串的32位指針,每個(gè)字符可能占1個(gè)字節(jié)或2個(gè)字節(jié)。
強(qiáng)制轉(zhuǎn)換為UNICODE,應(yīng)該是L。字符串(literal string)前面的大寫字母L,用于告訴編譯器該字符串應(yīng)該作為U n i c o d e字符
串來編譯。當(dāng)編譯器將字符串置于程序的數(shù)據(jù)部分中時(shí),它在每個(gè)字符之間分散插入零字節(jié)。
#ifdef _UNICODE
#define _T L
#else
#define _T
#endif
These data-type mappings are defined in TCHAR.H and depend on whether the constant _UNICODE or _MBCS has been defined in your program.
當(dāng)我們?cè)诶肅String 類便捷性時(shí),有些特殊化的東西無法做,于是相互之間的轉(zhuǎn)換變經(jīng)常被需要:
在轉(zhuǎn)換之前必須確保你的字符的范圍在你的范圍之內(nèi)。
1.CStirng轉(zhuǎn) char *
傳給未分配內(nèi)存的指針.
CString cstr1="ABCD";
char * ch=cstr1.GetBuffer(cstr1.GetLength()+1); //獲取指向CString最后一個(gè)字符的地址。
cstr1.ReleaseBuffer();
注意:用完ch后,不用 ch,因?yàn)檫@樣會(huì)破壞cstr內(nèi)部空間,容易造成程序崩潰.
GetBuffer :這個(gè)函數(shù)是為一個(gè)CString對(duì)象重新獲取其內(nèi)部字符緩沖區(qū)的指針,返回的LPTSTR為非const的,從而允許直接修改CString中的內(nèi)容! 如果nMinBufLength 比當(dāng)前buffer大,那么就調(diào)用ReleaseBuffer函數(shù)去釋放當(dāng)前的Buffer,用一個(gè)被請(qǐng)求的大小去覆蓋這個(gè)buffer.
而GetBuffer則是返回一個(gè)可以供調(diào)用者寫入的內(nèi)存,并且,你可以給定大小。其實(shí)它就相當(dāng)于申請(qǐng)一塊nLen大小的內(nèi)存,只不過,這塊內(nèi)存是被引用在CString對(duì)象的內(nèi)部而已,這是非常有效的一種用法,如果不直接用GetBuffer函數(shù)來申請(qǐng)的話,那么你必須用new操作符(或者 malloc()函數(shù))在CString的外部申請(qǐng),然后再將申請(qǐng)的內(nèi)存拷貝到CString對(duì)象中,顯然這是一個(gè)非常冗余的操作,會(huì)使你函數(shù)的效率大大下降。
ReleaseBuffer函數(shù)是用來告訴CString對(duì)象,你的GetBuffer所引用的內(nèi)存已經(jīng)使用完畢,現(xiàn)在必須對(duì)它進(jìn)行封口,否則 CString將不會(huì)知道它現(xiàn)在所包含的字符串的長度,所以在使用完GetBuffer之后,必須立即調(diào)用ReleaseBuffer函數(shù)重置 CString的內(nèi)部屬性,其實(shí)也就是頭部信息。
值賦給已分配內(nèi)存的char *
CString cstr1 = "ASDDSD";
int strLength = cstr1.GetLength() + 1;
char *pValue = new char[strLength];
strncpy(pValue, cstr1, strLength);
賦值:
char* psz = “joise”; 沒有構(gòu)造函數(shù),僅可以賦值(因?yàn)樗旧砭褪腔拘?
CString cstr( psz ); 可以從基本的一些字符串變量構(gòu)造而來,包括char*等
string str( cstr ); 可以從幾乎所有的字符串構(gòu)造而來,包括CString和char*;
以上也可以看作由 char *轉(zhuǎn)CStirng的辦法。
1.char *:
char *psz = NULL;
psz = new char[10]; //當(dāng)然,以上的直接寫成char *psz = new char[10];也是一樣
memset( psz, 0, 10 );
strcpy( psz, “joise” );
2.CString:
CString cstr;
cstr = psz; 字符指針直接賦值
3.string:
string str;
str = psz; 字符指針直接賦值
str = cstr; CString變量直接賦值
[]psz;
加運(yùn)算
string與CString差不多,可以直接與char*進(jìn)行加法,但不可以相互使用+運(yùn)算符
char*沒有+運(yùn)算,只能使用strcat把兩個(gè)指針連在一起;
strcat( psz, cstr );//合法
strcat( psz, str );//非法,由此可見,CString可自動(dòng)轉(zhuǎn)換為const char*,而string不行
[]運(yùn)算
CString最好,當(dāng)越界時(shí)會(huì)拋出斷言異常;
string與char*下標(biāo)越界結(jié)果未定義;
拓展:C語言字符串快速壓縮算法代碼
通過鍵盤輸入一串小寫字母(a~z)組成的字符串。
請(qǐng)編寫一個(gè)字符串壓縮程序,將字符串中連續(xù)出席的重復(fù)字母進(jìn)行壓縮,并輸出壓縮后的字符串。
壓縮規(guī)則:
1、僅壓縮連續(xù)重復(fù)出現(xiàn)的字符。比如字符串”abcbc”由于無連續(xù)重復(fù)字符,壓縮后的字符串還是”abcbc”。
2、壓縮字段的格式為”字符重復(fù)的次數(shù)+字符”。例如:字符串”xxxyyyyyyz”壓縮后就成為”3x6yz”。
示例
輸入:“cccddecc” 輸出:“3c2de2c”
輸入:“adef” 輸出:“adef”
輸入:“pppppppp” 輸出:“8p”
主要說來就是進(jìn)行字符串處理類的問題,主要涉及到:
1.字符串的輸入與輸出;
2.基本常用的C語言的字符串的函數(shù)使用;
3.對(duì)于多重情況的考慮;
4.將數(shù)字轉(zhuǎn)換成字符串并進(jìn)行拼接;
復(fù)制代碼 代碼如下:
#include
#include
#include
int main()
{
char str[100] = {'};
char res[100] = {'};
scanf("%s",str);
int length = strlen(str);
int i=0, j=0, k=0;
int count = 0;
do
{
if(i < length && str[i++] == str[j])
count++;
if(str[i] != str[j])
{
if(count <= 1)
res[k++] = str[j];
else
{
if(count > 1)
{
char temp[10] = {'};
itoa(count,temp,10);
strcpy(res+k,temp);
k+=strlen(temp);
res[k++] = str[j];
}
}
j = i;
count = 0;
}
}while(i<length);
res[k] = ';
printf("The result is : %sn",res);
return 0;
}
【C語言字符串】相關(guān)文章:
C語言之字符串處理函數(shù)08-31
C語言字符串知識(shí)點(diǎn)07-27
C語言中返回字符串函數(shù)的實(shí)現(xiàn)方法09-19
c語言中用字符串?dāng)?shù)組寫菜單的代碼10-02
計(jì)算機(jī)二級(jí)C語言字符串的指針以及指向字符串的指針變量07-09
C語言的結(jié)構(gòu)10-14
C語言和C++的分別06-18
C語言考點(diǎn)精選06-29