字串相關知識

2021-10-07 04:15:08 字數 3682 閱讀 4828

1.字串長度:strlen

求字串長度時,遇到「\0」就停下,前面所經過的字元數,就是字串的長度,不包括「\0」

注意:該函式的返回值為無符號整數。

例子:

int main()

else

return 0;

}

上述**輸出為什麼呢?

因為返回值無符號數,無符號數-無符號數永遠是大於等於0的,所以輸出了if分支的語句。

2.長度無約束字串拷貝:strcpy

source字串必須以「\0」結尾

source字串中的「\0」也會拷貝給目標字串

目標字串必須可變,空間足夠大(可容納source字串進行拷貝)

3.長度無約束字串拼接:strcat

source字串必須以「\0」結尾

source字串中的「\0」也會拷貝給目標字串

目標字串必須可變,空間足夠大(可容納source字串進行追加拷貝)

4.長度無約束字串比較:strcmp

以字元的ascii碼進行比較,從左往右,只要有乙個不相等(碰到了就停下),就意味著有大小

第乙個大於第二個,返回大於0的數字

第乙個等於第二個,返回0

第乙個小於第二個,返回小於0的數字

5.長度有約束字串拷貝:strncpy

定義: char *strncpy(char *dst, const char *src, size_t num);

將num個字元拷貝到dst當中

若src字串小於num,拷貝完src字串之後,在dst後面追加0,直到num個。

\0也要拷貝到dst當中

6.長度有約束字串拼接:strncat

定義:char *strnat(char *dst, const char *src, size_t num);

將num個字元追加拷貝到dst當中

若src字串小於num,追加完src字串之後,不追加0,拼接結束。

7.長度有約束字串比較:strncmp

定義:int strncmp(const char *str1, const char *str2, size_t num);

這裡的比較和無約束字串一樣,只不過對比較的字元長度進行了限制。

8.strstr:判定乙個字串是否為另乙個字串的子串,若為子串,返回該子串出現的第乙個位置到母串的結尾,否則返回為空。

定義:char *strstr( const char *str1, const char * str2);

乙個比較有意思的練習:求該字串是否是另乙個字串旋轉之後的結果。

見這一篇文章的第三個方法:字串旋轉,只需要將後面的判定方法改為strstr,若輸出不為null,則str2一定是str1的旋轉的結果。

9.strtok:字串切割,根據特定的分隔符(集合),進行字串切割

char *strtok( char *str, const char *sep)

子串擷取:

1.函式內部使用static區域性變數,來儲存歷史字串的剩餘子串

2.採用對分隔符進行設定\0 的策略進行子串劃分

3.strtok進行子串擷取的時候,採用的策略是擷取有效字串

4.分割的時候,strtok會自動進行分隔符隔離

模擬strtok函式實現:

int main()

char *my_strtok(char *str1, const char *sep)

char *s = null;//返回值

const char *t = null;

int flag = 1;//記錄第一次不為空的位址

int index = 0;//若有切割符,發生變化

for (; *str1 != '\0'; str1++)

}if (*str1 != null && flag == 1)//每一次呼叫的第一次不為空的位址

if (*str1 != null && flag == 0 && index==1)//將切割符走完,且後面出現不為空的字元,前面已經出現過切割符

}temp = str1;//裡面沒有切割符,直接令temp等於最後的位址

return s;//返回起始位址

}

10.strerror:將錯誤碼轉換為字串形式,方便查詢錯誤

錯誤碼:一般是表示,使用者在呼叫c標準庫函式的時候,如果呼叫庫函式的時候,出錯了,c語言中 有乙個全域性變數errno,就會被設定(預設為0,如果被設定了,就是非0)

就是用來表明詳細的錯誤原因(庫函式呼叫說明c錯誤)

標頭檔案為

11.memcpy:位元組拷貝函式

定義:void *memcpy(void *dst, const void *src, size_t num);

從src中複製num個位元組到dst的記憶體位置

若src中的位元組數小於num,拷貝到src最後乙個位元組就會停止

若dst中的位元組數小於num個,會對後面的位元組進行拷貝,直到src中的最後乙個位元組

12.memmove:位元組拷貝。

memmove記憶體拷貝,如果發生記憶體重疊,memmove能夠保證使src在被覆蓋之前拷貝到dst當中,拷貝之後,src也會發生變化。

若無記憶體重疊,memcopy和memmove功能相同。

定義:void *memmove(void *dst, const void *src, size_t num);

解決記憶體重疊的問題:

通過一定的判定,來進行決策,是從右向左拷貝,還是從左向右拷貝。

若src向src+1拷貝整個位元組,就會出現這樣的情況,這樣就發生的記憶體重疊,達不到我們預期的結果。

達到預期結果,也可以進行模擬這個函式。

有記憶體重疊時,進行拷貝時,使用memmove函式更好。

13.memset:記憶體賦值函式

定義:void *memset(void *dst, int value, size_t num);

按照位元組為單位進行賦值,把每個位元組賦值為value

可對陣列進行清0操作,但若想賦特定的值,一定要注意使用,因為memset是按照每個位元組進行運算的。

字串相關知識

可不使用new方式 當從字串池中查詢,沒有時,則需要字串建立 例子 string prompt hello,world 使用後new建立方式 每次建立乙個新物件 例子 string prompt new string hello,world 字串相等比較 equals 字元名稱.equalsigno...

字串編碼相關知識

一 編碼的種類情況 二 unicode 與 uft 由於每個國家都有自己的編碼規則,其僅涵蓋本國字元,無其他國家字元的對應關係,所以unicode 萬國碼 應運而生,它涵蓋了全球所有的文字和二進位制的對應關係。unicode 起到2個作用 直接支援全球所有語言,每個國家都可以不用再使用自己之前的舊編...

字串操作相關知識 index and find

str1 hello word print str1.startswith h 6,10 判斷字串是否以哪個開頭,也可以指定範圍 print str1.endswith 判斷字串是否以哪個結尾,也可以指定範圍 index查詢與find查詢的異同 find num str1.find word 查詢要...