亚洲中文日韩国产一区|亚洲国产精品原创巨作AV无遮挡|色依依国内精品中文字幕|日韩精品免费在线视频

<button id="lyzxa"><option id="lyzxa"><em id="lyzxa"></em></option></button>
    C語言

    C語言字符串

    時間:2024-07-24 16:38:05 C語言 我要投稿

    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ù)組與字符串的使用09-19

    C語言中返回字符串函數(shù)的實現(xiàn)方法09-19

    8種C語言基本常用的字符串處理函數(shù)05-30

    c語言中用字符串數(shù)組寫菜單的代碼10-02

    計算機二級C語言字符串的指針以及指向字符串的指針變量07-09

    C語言的結構10-14

    C語言和C++的分別06-18

    C語言考點精選06-29