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

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;
}

如有错误请指出,谢谢

C/C++ 对常见字符串库函数的实现的更多相关文章

  1. java常见字符串的操作

    /** * java常见字符串的操作 */ public class Test7 { public static void main(String args[]){ StringBuffer sBuf ...

  2. Python 常见字符串常量和表达式

    常见字符串常量和表达式 操作 解释 s = '' 空字符串 s = "spam's" 双引号和单引号相同 S = 's\np\ta\x00m' 转义序列 s = "&qu ...

  3. Python中常见字符串去除空格的方法总结

    Python中常见字符串去除空格的方法总结 1:strip()方法,去除字符串开头或者结尾的空格>>> a = " a b c ">>> a.s ...

  4. C语言讲义——字符串库函数

    字符串库函数<string.h> 求字符串长度(不含结束符'\0'****) strlen(str) 字符串赋值(可能造成数组越界) strcpy(str," 水浒传 " ...

  5. 5. 常见C语言字符串库函数的使用及实现

    1. strncat 函数: [函数原型]#include <string.h> char *strncat( char *str1, const char *str2, size_t c ...

  6. c语言中几个常见的库函数strlen、strcmp、strcat、strcpy、strncpy、memset、memcpy、memmove、mmap

    1.strlen() 1)计算给定字符串的长度,不包括’\0’在内 unsigned int strlen(const char *s) { assert(NULL != s);//如果条件不满足,则 ...

  7. c语言字符串库函数#include<string.h>

    字符串函数<string.h> 在头文件<string.h>中定义了两组字符串函数.第一组函数的名字以str开头:第二组函数的名字以mem开头.只有函数memmove对重叠对象 ...

  8. mysql常见字符串处理函数结束

    一.简明总结 ASCII(char) 返回字符的ASCII码值 BIT_LENGTH(str) 返回字符串的比特长度 CONCAT(s1,s2…,sn) 将s1,s2…,sn连接成字符串 CONCAT ...

  9. C语言字符串库函数的实现

    1.strlen(字符串的长度) size_t Strlen(const char* str) { assert(str); ;; ++i) { if (str[i] == '\0') return ...

随机推荐

  1. String 去重,区分大小写

    题目要求:去除,和.,相同的单词去除后面的.区分大小写 示例:输入:There is a will,there is a way. 输出There is a will there way 答案代码: ...

  2. 欧几里得算法与扩展欧几里得算法_C++

    先感谢参考文献:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 注:以下讨论的数均为整数 一.欧几里得算法(重点是证 ...

  3. &&和||的那点事儿

    以前一直以为&&和||的运算结果就是布尔值,但今天看到一段代码又填补的一些知识漏洞. var a = (1&&2&&5) || 3; console.l ...

  4. ASP.NET MVC 中使用 AjaxFileUpload 插件时,上传图片后不能显示(预览)

    AjaxFileUpload 插件是一个很简洁很好用的上传文件的插件,可以实现异步上传功能,但是在 ASP.NET MVC中使用时,会出现上传图片后不能正确的显示的问题,经过仔细排查,终于找到原因,解 ...

  5. js日期的写法,获取girdviw的行数、提示信息、验证数量信息

    //制订日期(js日期的写法) var myDate = new Date(); var theDate = myDate.toLocaleDateString();  //获取今天的日期 //获取控 ...

  6. java学习之(垃圾回收)

    程序无法精确控制java垃圾回收的时机,但依然可以强制系统进行垃圾回收--这种强制只是通知系统进行垃圾回收, 但系统是否进行垃圾回收依然不确定.大部分时候,程序强制系统垃圾回收后总会有一些效果,强制系 ...

  7. ubuntu下,apt的参数使用,很实用呦

    ubuntu下apt-get 命令参数 常用的APT命令参数 apt-cache search package 搜索包 apt-cache show package 获取包的相关信息,如说明.大小.版 ...

  8. ECSHOP如何解决Deprecated: preg_replace()报错 Home / 开源程序 / ECSHOP / ECSHOP如何解决Deprecated: preg_replace()报错

    Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in D:\w ...

  9. AX 用代码创建FORM动态加控件,重载动态添加的控件的方法。

    eg. 范例:class\RFIDReadWriteForm/Build方法. formRun.controlMethodOverload(true); formRun.controlMethodOv ...

  10. 1.2Android系统移植的主要工作

    1.Android移植分为两部分:应用移植和系统移植: 2.应用移植:指将第四层的应用程序一直到某一特定硬件平台上. (1)为保证应用程序能在新的平台上正常运行,需要对源代码就行一些修改,因为硬件平台 ...