C/C++ 对常见字符串库函数的实现

在C中的string.h头文件中存在很多对字符串进行操作的函数,利用这些函数可以方便的对字符串进行操作。下面将对常见的字符串函数进行解释和实现。

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"进行创建。

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;//更为简洁 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/09ac4fc3bfeaa741495b87fe8cdcb902.html