在c中的string.h頭文件中存在不少對字符串進行操做的函數,利用這些函數能夠方便的對字符串進行操做。下面將對常見的字符串函數進行解釋和實現。c++
strcpy
函數原型:char* _strcpy(char* dest,char* src)
函數功能:將str所指由nullptr的字符串複製到dst所指的數組中,並返回dest的指針。
函數說明:保證src和dest所指內存區域不能重疊且dest必須有足夠的空間來容納src的字符串。
函數實現面試
char* _strcpy(char* dest, const char* src) { assert(dest != nullptr&&src != nullptr); //判斷dest指針和src指針是否爲空,若爲空拋出異常 char* tmp = dest; while (*tmp++ = *src++) ; return dest; }
strncpy數組
函數原型:char* _strncpy(char* dest,const char* src,size_t n)
函數功能:把src所指由nullptr結尾的字符串前n個字節複製到dest所指的數組中。
函數說明:若是src的前n個字節不含nullptr,則結果不會以nullptr結束;若是src的的長度小於n個字節,則以nullptr填充dest直到複製完n個字節;保證src和dest所指內存區域不能重疊且dest必須有足夠的空間來容納src的字符串。
函數實現:函數
char* _strncpy(char* dest, const char* src, int n) { assert(dest != nullptr&&src != nullptr); //判斷dest指針和src指針是否爲空,若爲空拋出異常 int i = 0; char* tmp = dest; while (i++ < n && (*tmp++ = *src++)) ; while (i++ < n) *tmp++ = '\0'; return dest; }
strcat
函數原型:char* _strcat(char dest, const char src)
函數功能:把src所指字符串添加到dest結尾處(覆蓋dest結尾處的'\0')並添加'\0'。
函數說明:保證src和dest所指內存區域不能重疊且dest必須有足夠的空間來容納src的字符串。
函數實現:指針
char* _strcat(char* dest, const char* src) { assert(dest != nullptr&&src != nullptr); //判斷dest指針和src指針是否爲空,若爲空拋出異常 char* tmp = dest; while (*tmp)//若爲while(*dest++)則會跳過dest中的'\0'致使沒法鏈接 tmp++; while (*tmp++ = *src++) ; return dest; }
注意:使用時若實參dest的建立爲char* dest=「abcd」,雖然能夠編譯經過,但運行時會引起中斷,由於「abcd」爲字符串常量,不可修改,能夠使用char dest[n]="abcd"進行建立。code
strncat
函數原型:char* _strncat(char* dest, const char* src,size_t n)
函數功能:把src所指字符串的前n個字符添加到dest結尾處(覆蓋dest結尾處的'\0')並添加'\0'。
函數說明:保證src和dest所指內存區域不能重疊且dest必須有足夠的空間來容納src的字符串。
函數實現:遞歸
char* _strncat(char* dest, const char* src, size_t n) { assert(dest != nullptr&&src != nullptr); //判斷dest指針和src指針是否爲空,若爲空拋出異常 char* tmp = dest; while (*tmp)//若爲while(*dest++)則會跳過dest中的'\0'致使沒法鏈接 tmp++; while (n--) { if (!(*tmp++ = *src++))//保證當src的長度小於n時,此時tmp已有'\0' return dest; } *tmp = '\0';//對於src長度大於n時,加上字符串結尾 return dest; }
strlen
函數原型:size_t _strlen(const char* str)
函數功能:計算字符串str的長度。
函數說明:返回s的長度,不包括結束符NULL。
函數實現:內存
//常規寫法 size_t _strlen(const char* str) { assert(str); const char* eofStr = str; while (*eofStr++) ; return (eofStr - str - 1); } //遞歸寫法,不借助變量(面試題要求) size_t _strlen_R(const char* str) { /*if ('\0' == str) return 0; return _strlen_R(str + 1) + 1;*/ return *str ? _strlen_R(str + 1) + 1 : 0;//更爲簡潔 }
strcmp
函數原型:int _strcmp(const char* dest, const char* src)
函數功能:比較字符串dest和src。
函數說明:
當dest< src時,返回值 < 0
當dest= src時,返回值 = 0
當dest> src時,返回值 > 0
函數實現:字符串
int _strcmp(const char* dest, const char* src) { assert(dest != nullptr&&src != nullptr); //判斷dest指針和src指針是否爲空,若爲空拋出異常 while (*dest&&*src && (*dest == *src)) { dest++; src++; } return (*dest - *src); }
strncmp
函數原型:int _strncmp(const char* dest, const char* src, size_t n)
函數功能:比較字符串dest和src的前n個字符。
函數說明: 若是前n字節徹底相等,返回值就爲0;在前n字節比較過程當中,若是出現dest[n]與src[n]不等,則返回(dest[n]-src[n])。
函數實現:原型
int _strncmp(const char* dest, const char* src, size_t n) { assert(dest != nullptr&&src != nullptr); //判斷dest指針和src指針是否爲空,若爲空拋出異常 if (!n)//若n爲0,則返回0; return 0; while (n--&&*dest&&*src && (*dest == *src)) { dest++; src++; } return (*dest - *src); }
strstr
函數原型:
函數功能:找出src字符串在dest字符串中第一次出現的位置(不包括src的'\0')
函數說明:返回該位置的指針,如找不到,返回空指針。
函數實現:
char* _strstr(const char* dest, const char* src) { assert(dest != nullptr); //判斷dest指針是否爲空,若爲空拋出異常 if (!src) return (char*)dest; while (*dest) { const char* destTmp = dest; const char* srcTmp = src; while (*srcTmp == *destTmp && (*srcTmp))//限時*srcTmp與*destTmp比較後相等至'\0'時繼續訪問出現越界 { srcTmp++; destTmp++; } if (!(*srcTmp)) return (char*)destTmp; dest++; } return nullptr; }
若有錯誤請指出,謝謝