C語言中的字串操作函式

2021-08-19 05:34:45 字數 3752 閱讀 4546

簡單記錄c語言對字串的操作函式,難點在於字串結束符的處理和寬字串的處理

c++也使用char, wchar_t表示字元型和寬字元型

本地為中文作業系統

處理多位元組字串:

處理字串的函式基本都在

char *pmultichar = "這是ansi字串";
size_t strlen(const char *s1)

int nlen = strlen(pmultichar);   //nlen為14,不包括字串結束符0;在ansi編碼下,每個中文佔兩個位元組
函式行為:返回從pmultichar到結束符0的位元組數,不包括結束符0;

行為備註:strlen會從pmultichar一直遍歷直到出現0

注意事項:使用者要保證pmultichar以0結束;不要應用於unicode字串,裡面0多,返回結果不正確,unicode串用wcslen

char *strcpy(char *sdest, const char *ssrc)

char *pcopybuffer = new char[strlen(pmultichar) + 1];

strcpy(pcopybuffer , pmultichar);

行為備註:strcpy不管pcopybuffer是否分配了足夠的空間,會一直拷貝直到遇到pmultichar的結束符0,然後拷貝0,結束

正確呼叫:使用者要保證pmultichar要正確的以0結束,否則函式會一直拷貝直到遇到0;同時要保證pcopybuffer有足夠的空間儲存pmultichar,包括結束符0,否則會越界拷貝(直到拷貝完結束符0)

異常備註:如果pcopybuffer分配的空間比strlen(pmultichar)+1大,strcpy拷貝完後也不管剩下的部分。

char *strncpy(char *sdest, const char *ssrc, size_t copysize)

char *pncopybuffer = new char[strlen(pmultichar)];

strncpy(pncopybuffer, pmultichar, strlen(pmultichar) - 1); //沒有拷貝最後乙個位元組

*(pncopybuffer + strlen(pmultichar) - 1) = 0;              //末尾加結束符0

函式行為:strncpy拷貝copysize個位元組到sdest

行為備註:從ssrc開始,無論如何都會拷貝copysize個位元組!

正確呼叫:pncopybuffer分配的長度要包括結束符0,比如想拷貝5個位元組,則分配6個位元組,最後手動加0;copysize不要超過sdest分配的長度-1

異常備註:ssrc的長度和copysize之間的關係不重要,因為如果copysize大於要拷貝的字串長度,則結束符0後面用0補齊,如果copysize小,則只拷貝copysize個位元組;關鍵在於sdest分配的長度和copysize的關係,如果sdest空間比copysize大,則拷貝完copysize個位元組後,剩下的空間不動,如果sdest分配的空間沒有copysize大,拷貝會越界;注意sdest分配的空間至少比copysize大1,用來新增結束符0

int strcmp(const char *s1, const char *s2)

函式行為:比較字串s1和s2的大小。如果s1大,返回正數(1);相等,返回0;s1小,返回負數(-1)

void *menset(void *s1, int val, size_t size)

函式行為:把從s1開始的size個位元組置為val。如果size比s1分配的空間大,則會越界操作,所以注意size值不要超過s1分配的大小

int printf(const char * format, ...)

處理寬字串

wchar_t定義在中,用來儲存寬字元;寬字串有關操作函式大都也在中

l巨集定義可以把字串表示為寬字元和寬字串

wchar_t *pwidechar = l"這是unicode字串";
size_t wcslen(const wchar_t *s1)

int nlen = wcslen(pwidechar);   //nlen為12 表示字元數,不包括結束符00
函式行為:返回從pwidechar到結束符00的字元數,不包括結束符00;遇到單個0不會結束

行為備註:由於unicode編碼使用雙位元組表示字元,所以可以算出字元數;strlen無法算出字元數,只能算出位元組數,因為多位元組編碼使用乙個或兩個位元組表示乙個字元

正確呼叫:保證s1是unicode字串;並以00結束

wchar_t*wcscpy(wchar_t*sdest, constwchar_t*ssrc)

wchar_t *pwidebuffer = new wchar_t[wcslen(pwidechar) + 1];

wcscpy(pwidebuffer, pwidechar);

函式行為:與strcpy類似,把ssrc按字元拷貝到sdest,直到遇到結束符00,拷貝00,結束

行為備註:wcscpy不管sdest是否分配了足夠的空間;動態分配陣列的中括號裡填的是字元數

正確呼叫:ssrc要以00結尾;sdest要分配足夠裝下ssrc及結束符00的空間

wchar_t*wcsncpy(wchar_t*sdest, constwchar_t*ssrc, size_t copysize)

wchar_t *pwidebuffer = new wchar_t[wcslen(pwidechar) + 1];

wcsncpy(pwidebuffer, pwidechar, wcslen(pwidechar));

*(pwidebuffer + wcslen(pwidechar)) = 0;

函式行為與strncpy相似,注意copysize為字元數;結束符為00;指標每次移動2個位元組;賦值=0把該字元(兩個位元組)置0

int wcscmp(const wchar_t *s1, const wchar_t *s2)

函式行為:比較字串s1和s2的大小。如果s1大,返回正數(1);相等,返回0;s1小,返回負數(-1)

void *wmemset(wchar_t *s1, wchar_t val, size_t size)

函式行為:把從s1開始的size個字元置為val。如果size比s1分配的空間大,則會越界操作,所以注意size值不要超過s1分配的大小;val是wchar_t型別,如3,l'漢',『a』等

int wprintf(const wchar_t *format, ...)

c語言中字串操作的函式

include include 務必包含這個標頭檔案 void str cat char str1,char str2 void str cpy char str1,char str2 void str n cpy char str1,char str2,int n void str cmp cha...

C語言中基本的字串操作函式

把字串s2複製到s1,直到遇到s2中的 0 為止。s1要有足夠的空間容納s2,且s1中的內容被覆蓋,函式返回的是s1。s1必須是字元型陣列基位址,s2可以是字元陣列名或字串常量。將字串s2接到字串s1後面,陣列s1要足夠大。引數s1必須是字元陣列基位址,引數s2可以是字元陣列名或字串常量。引數s1和...

C語言中的字串函式

一.ansi c標準中的字串函式 使用時要包含標頭檔案 string.h 1.strcpy 宣告 char strcpy char dest,char src 功能 把src指向的字串複製到dest中 返回值 dest 說明 目的指標dest一定是已經分配記憶體的指標,dest和src所指記憶體區域...