# cstyly字串函數實作
1. strlen
用途:字串求長
功能:計算給定字串的(unsigned int)長度,不包括'\0'在內,引述指向的字串必須以'\0'結束,返回值為size_t。
用法:size_t strlen(const char* str)
```cpp=
int strlen_f(const char* s){
int count = 0;
while(*s != '\0'){
++count;
++s;
}
return count;
}
```
---
2. strcpy
用途:字串複製
功能:把源字串複製到目標空間。源字串必須以 '\0' 結束,目標空間必須可變,src 和 dest 所指記憶體區域不可以重疊且 dest 必須有足夠的空間來容納 src 的字串。
用法:char* strcpy(char* destination, const char* source)
```cpp=
char* strcpy_f(char* dest, const char* src) {
char* ret = dest;
assert(dest != NULL);
assert(src != NULL);
while(*dest++ = *src++)
;
return ret;
}
```
---
3. strcat
用途:字串連接
功能:把兩個字串連線起來。源字串必須以 '\0' 結束,目標空間必須可變。把 src 所指字串新增到 dest 結尾處(覆蓋 dest 結尾處的 '\0' ), dest 必須有足夠的空間來容納 src 的字串
用法:char* strcat(char* destination, const char* source)
```cpp=
char* strcat_f(char* dest, const char* src) {
char* ret = dest;
assert(dest != NULL);
assert(src != NULL);
while(*dest != '\0')
dest++;
while(*dest++ = *src++)
;
return ret;
}
```
---
4. strcmp
用途:字串比較
功能:設這兩個字串為str1,str2,看ASCII碼,若str1=str2,則返回零;若str1<str2,則返回負數;若str1>str2,則返回正數。
用法:int strcmp(const char* str1, const char* str2)
```cpp=
int strcmp_f(const char* str1, const char* str2) {
while(*str1 && *str2 && *str1 == *str2) {
++str1;
++str2;
}
return *str1 - *str2;
}
```
---
5. strchr
用途:查詢字串str中首次出現字元ch的位置
功能:返回首次出現ch的位置的指標,如果str中不存在ch則返回NULL。
用法:const char* strchr(const char* str, char character)
```cpp=
const char* strchr_f(const char* str, char ch) {
assert(str != NULL);
while(*str != '\0' && *str != ch) ++str;
return *str == ch ? str : NULL;
}
```
6. strstr(KMP演算法)
用途:查詢字串str1中首次出現字串str2的位置
功能:若str2是str1的子串,則返回str2在str1的首次出現的地址;如果str2不是str1的子串,則返回NULL。
用法:char* strstr(const char* string, const char* target)
```cpp=
int strstr_f(const char* S, const char* T) {
if(!S || !T || T[0] == '\0' || S[0] == '\0') return -1; //空指針或空串
int len = 0;
const char* c = T;
while(*c++ != '\0') ++len; //字符串T的長度
int *next = new int[len + 1];
get_next(T, next);
int index = 0, i = 0, j = 0;
while(S[i] != '\0' && T[j] != '\0') {
if(S[i] == T[j]) {
++i;
++j;
}
else {
index += j - next[j];
if(next[j] != -1)
j = next[j];// 模式串向右移动
else {
j = 0;
++i;
}
}
}
delete []next;
if(T[j] == '/0')
return index;// 匹配成功
else
return -1;
}
void get_next(const char* T,int* next) {
int k = -1, j = 0;
next[0] = -1;
while(T[j] != '\0') {
if(k != -1 && T[k] != T[j])
k = next[k];
++j;
++k;
if(T[k] == T[j])
next[j] = next[k];
else
next[j] = k;
}
}
```
http://www.uml.org.cn/c++/201207261.asp
###### tags: `筆記`