# 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: `筆記`