# 字串筆記
## 筆記傳送門
* [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'也算是一個字元,在陣列裡面會佔一個位子

## 宣告一個字串
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"
## 輸入輸出



* 字串是==記憶體==,能直接做加減,單位為宣告的資料型別(char)
* 輸入如果有空格,只會取==空格前一段==
* 指定陣列中某個元素為'\0',當輸出遇到時會==直接終止==
## 修改字串內容
>字串是個陣列,不能直接修改
>但是可以修改單一位置的值
>要修改使用指標重新指向另一個東西

## 字串常數 (char \*str)
* 放置在一個==唯讀==的區域內
* 區域大小是有限的
* 其形態為:const char*
* 指向別的字串常數過後,就找不回原來那個字串了
## 有關<string.h>的關鍵字
## 字串長度(strlen)
### 宣告:
>輸出型別為size_t
>size_t strlen(const char\*str)
>功能:回傳str的長度(不含'\0')

## 字串比較(strcmp)
### 宣告:
>輸出型別為int
>strcmp(const char\* str1, const char\* str2)
>功能:比較字串是否相同
>成功return 0,不成功return 非0

### 延伸:
>strncmp(const char\* str1,const char\* str2,int n)
>功能:比對str1與str2前n個字元是否相同
## 字串複製(strcpy)
### 宣告:
>輸出為字元陣列型別
>strcpy(char\* str1,const char\* str2)
>功能:將str1的內容取代成str2

### 延伸:
>strncpy(char\* str1,const char\* str2,int n)
>功能:將str1的前n個字元取代成str2的前n個字元
## 字串切割(strtok)
### 宣告:
* >輸出為字元陣列型別
* >strtok(char\* str,const char\* delim)
* >功能:strtok() 會修改原始字串,將「切割符號 (像是上面舉例的 / )」改成 ‘\0’
* >回傳值:切割部分的==開頭指標==
* >當參數列str的部分為==NULL==時,代表從==原字串繼續往下切割==
* >切割過程中,在呼叫一次之後,字串必須設為空(NULL)。
>==會改變原字串==

### delim可以直接寫字元型態


## 切割過程
### 1.(原字串)

### 2.(遇到delim轉為\0,將token放在'\0'後)

### 3.(原本ptr會在token位置,但strtok會自動防止==leading delimiter==,所以ptr自動往後一位)

### 4

### 5(當token到底了strtok回傳NULL)

## 字串處理(memset)
### 宣告:
>輸出為字元陣列型別
>memset(void\* ptr,int value,size_t size)
>功能:對ptr往後(size)bytes的空間的值==設成value==
>回傳值:ptr的==開頭位置==
>設值的單位為byte,使用大於1byte的資料型態需要特別注意(==0<=vlaue<=255==)

## 字串子集找尋(strstr)
### 宣告:
>輸出為字元陣列型別
>strstr(comst char\* str1,const char\* str2)
>功能:找尋str1中有沒有str2(sub-string)的存在
>回傳值:找到str1中出現str2的==開頭指標==,找不到時回傳NULL

## 字串串接(strcat)
### 宣告:
>輸出為字元陣列型別
>strcat(chat\* str1,const char\* str2)
>功能:將str2的內容串接到str1後面
>回傳直:str1的==開頭位址==

### 延伸:
>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出現

## 字串對比(反)(strcspn)
### 宣告:
>輸出為==size_t==
>strcspn(const char\* str1,const char\* str2)
>功能:找尋str1前面有幾格字元==不在==str2裡出現
>回傳值:N代表str1前N個字元不在str2中出現

## 字串字元找尋(strchr)
### 宣告:
>輸出為字元陣列型態
>strchr(char\* const str,const char ch)
>功能:==找尋==str中是否有ch出現
>回傳值:ch在str中出現的位址,找不到回傳NULL

## 字串字元反向找尋(strchr)
>功能:==反向找尋==str中是否有ch出現

## 字串對比找尋(strpbrk)
### 宣告:
>輸出為字元陣列型態
>strpbrk(const char\* str1,const char\* str2)
>功能:==找尋==str1是否有字元也在str2出現
>回傳值:回傳該字元出現的位址,找不到回傳NULL