# 字串筆記 ## 筆記傳送門 * [C語言筆記](https://hackmd.io/0cmnBvxvT4GFk-sFeOtl4g?view) * [關鍵字筆記](https://hackmd.io/wkJEDjCGTTWV-IjvEzXjYA?view) * [函式筆記](https://hackmd.io/HC69PJDBT5KLd-LthrD14Q?view) * [陣列筆記](https://hackmd.io/uyU7KciRRp2rnZngbA5NoQ?view) * [指標筆記](https://hackmd.io/H6tpMXfpSq-MdZiL1wVNRg?view) ## 字串 * 字串是char陣列的一種 * 結尾處有結束字元=='\0'== * '\0'也算是一個字元,在陣列裡面會佔一個位子 ![](https://i.imgur.com/4DWFFk5.png) ## 宣告一個字串 1. char str[5]={'h','e','l','l','o'}; 2. char str[6]="hello"; >預留位置給'\0' 3. char str[]="hello" >不指定長度 編譯器自動補上'\0' 4. char \*str="hello" >指標指向字串常數"hello" ## 輸入輸出 ![](https://i.imgur.com/gRYFckQ.png) ![](https://i.imgur.com/Tt7LOnV.png) ![](https://i.imgur.com/bgpR866.png) * 字串是==記憶體==,能直接做加減,單位為宣告的資料型別(char) * 輸入如果有空格,只會取==空格前一段== * 指定陣列中某個元素為'\0',當輸出遇到時會==直接終止== ## 修改字串內容 >字串是個陣列,不能直接修改 >但是可以修改單一位置的值 >要修改使用指標重新指向另一個東西 ![](https://i.imgur.com/IJPMKID.png) ## 字串常數 (char \*str) * 放置在一個==唯讀==的區域內 * 區域大小是有限的 * 其形態為:const char* * 指向別的字串常數過後,就找不回原來那個字串了 ## 有關<string.h>的關鍵字 ## 字串長度(strlen) ### 宣告: >輸出型別為size_t >size_t strlen(const char\*str) >功能:回傳str的長度(不含'\0') ![](https://i.imgur.com/r0SUYRd.png) ## 字串比較(strcmp) ### 宣告: >輸出型別為int >strcmp(const char\* str1, const char\* str2) >功能:比較字串是否相同 >成功return 0,不成功return 非0 ![](https://i.imgur.com/LNADUjV.png) ### 延伸: >strncmp(const char\* str1,const char\* str2,int n) >功能:比對str1與str2前n個字元是否相同 ## 字串複製(strcpy) ### 宣告: >輸出為字元陣列型別 >strcpy(char\* str1,const char\* str2) >功能:將str1的內容取代成str2 ![](https://i.imgur.com/Gz3FPHs.png) ### 延伸: >strncpy(char\* str1,const char\* str2,int n) >功能:將str1的前n個字元取代成str2的前n個字元 ## 字串切割(strtok) ### 宣告: * >輸出為字元陣列型別 * >strtok(char\* str,const char\* delim) * >功能:strtok() 會修改原始字串,將「切割符號 (像是上面舉例的 / )」改成 ‘\0’ * >回傳值:切割部分的==開頭指標== * >當參數列str的部分為==NULL==時,代表從==原字串繼續往下切割== * >切割過程中,在呼叫一次之後,字串必須設為空(NULL)。 >==會改變原字串== ![](https://i.imgur.com/43ye8Ox.png) ### delim可以直接寫字元型態 ![](https://i.imgur.com/3UgURz4.png) ![](https://i.imgur.com/rjtZnzV.png) ## 切割過程 ### 1.(原字串) ![](https://i.imgur.com/qUJAaJX.png) ### 2.(遇到delim轉為\0,將token放在'\0'後) ![](https://i.imgur.com/HpC8g7J.png) ### 3.(原本ptr會在token位置,但strtok會自動防止==leading delimiter==,所以ptr自動往後一位) ![](https://i.imgur.com/f25F6Mc.png) ### 4 ![](https://i.imgur.com/U6CkIIF.png) ### 5(當token到底了strtok回傳NULL) ![](https://i.imgur.com/8vdnji8.png) ## 字串處理(memset) ### 宣告: >輸出為字元陣列型別 >memset(void\* ptr,int value,size_t size) >功能:對ptr往後(size)bytes的空間的值==設成value== >回傳值:ptr的==開頭位置== >設值的單位為byte,使用大於1byte的資料型態需要特別注意(==0<=vlaue<=255==) ![](https://i.imgur.com/bMFLF2E.png) ## 字串子集找尋(strstr) ### 宣告: >輸出為字元陣列型別 >strstr(comst char\* str1,const char\* str2) >功能:找尋str1中有沒有str2(sub-string)的存在 >回傳值:找到str1中出現str2的==開頭指標==,找不到時回傳NULL ![](https://i.imgur.com/VP0B2qL.png) ## 字串串接(strcat) ### 宣告: >輸出為字元陣列型別 >strcat(chat\* str1,const char\* str2) >功能:將str2的內容串接到str1後面 >回傳直:str1的==開頭位址== ![](https://i.imgur.com/6fFTNpH.png) ### 延伸: >strncat(chat\* str1,const char\* str2,int n) >功能:將str2前n個字元串接到str1後面 ## 字串對比(strspn) ### 宣告: >輸出為==size_t== >strspn(const char\* str1,const char\* str2) >功能:找尋str1前面有幾格字==有==在str2裡出現 >回傳值:N代表str1前N個字元有在str2出現 ![](https://i.imgur.com/vWg42ir.png) ## 字串對比(反)(strcspn) ### 宣告: >輸出為==size_t== >strcspn(const char\* str1,const char\* str2) >功能:找尋str1前面有幾格字元==不在==str2裡出現 >回傳值:N代表str1前N個字元不在str2中出現 ![](https://i.imgur.com/bmkXr11.png) ## 字串字元找尋(strchr) ### 宣告: >輸出為字元陣列型態 >strchr(char\* const str,const char ch) >功能:==找尋==str中是否有ch出現 >回傳值:ch在str中出現的位址,找不到回傳NULL ![](https://i.imgur.com/ms2jLRQ.png) ## 字串字元反向找尋(strchr) >功能:==反向找尋==str中是否有ch出現 ![](https://i.imgur.com/5jjScvZ.png) ## 字串對比找尋(strpbrk) ### 宣告: >輸出為字元陣列型態 >strpbrk(const char\* str1,const char\* str2) >功能:==找尋==str1是否有字元也在str2出現 >回傳值:回傳該字元出現的位址,找不到回傳NULL