1.字串長度:strlen
求字串長度時,遇到「\0」
就停下,前面所經過的字元數,就是字串的長度,不包括「\0」
。
注意:該函式的返回值為無符號整數。
例子:
int main()
else
return 0;
}
上述**輸出為什麼呢?
因為返回值無符號數,無符號數-無符號數永遠是大於等於0的,所以輸出了if分支的語句。
2.長度無約束字串拷貝:strcpy
source字串必須以「\0」結尾3.長度無約束字串拼接:strcatsource字串中的「\0」也會拷貝給目標字串
目標字串必須可變,空間足夠大(可容納source字串進行拷貝)
source字串必須以「\0」結尾4.長度無約束字串比較:strcmpsource字串中的「\0」也會拷貝給目標字串
目標字串必須可變,空間足夠大(可容納source字串進行追加拷貝)
以字元的ascii碼進行比較,從左往右,只要有乙個不相等(碰到了就停下),就意味著有大小5.長度有約束字串拷貝:strncpy第乙個大於第二個,返回大於0的數字
第乙個等於第二個,返回0
第乙個小於第二個,返回小於0的數字
定義: char *strncpy(char *dst, const char *src, size_t num);6.長度有約束字串拼接:strncat將num個字元拷貝到dst當中
若src字串小於num,拷貝完src字串之後,在dst後面追加0,直到num個。
\0也要拷貝到dst當中
定義:char *strnat(char *dst, const char *src, size_t num);7.長度有約束字串比較:strncmp將num個字元追加拷貝到dst當中
若src字串小於num,追加完src字串之後,不追加0,拼接結束。
定義: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)模擬strtok函式實現:子串擷取:
1.函式內部使用static區域性變數,來儲存歷史字串的剩餘子串
2.採用對分隔符進行設定\0 的策略進行子串劃分
3.strtok進行子串擷取的時候,採用的策略是擷取有效字串
4.分割的時候,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)11.memcpy:位元組拷貝函式就是用來表明詳細的錯誤原因(庫函式呼叫說明c錯誤)
標頭檔案為
定義:void *memcpy(void *dst, const void *src, size_t num);12.memmove:位元組拷貝。從src中複製num個位元組到dst的記憶體位置
若src中的位元組數小於num,拷貝到src最後乙個位元組就會停止
若dst中的位元組數小於num個,會對後面的位元組進行拷貝,直到src中的最後乙個位元組
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 查詢要...