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