zoukankan      html  css  js  c++  java
  • 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++ = '';
    	return dest;
    }
    

    strcat
    函数原型:char* _strcat(char *dest, const char *src)
    函数功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'')并添加''。
    函数说明:保证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中的''导致无法连接
    		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结尾处的'')并添加''。
    函数说明:保证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中的''导致无法连接
    		tmp++;
    
    	while (n--)
    	{
    		if (!(*tmp++ = *src++))//保证当src的长度小于n时,此时tmp已有''
    			return dest;
    	}
    
    	*tmp = '';//对于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 ('' == 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的'')
    函数说明:返回该位置的指针,如找不到,返回空指针。
    函数实现

    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比较后相等至''时继续访问出现越界
    		{
    			srcTmp++;
    			destTmp++;
    		}
    		if (!(*srcTmp))
    			return (char*)destTmp;
    
    		dest++;
    	}
    	return nullptr;
    }
    

    如有错误请指出,谢谢

  • 相关阅读:
    cloudera cdh4 hue 安装
    设计模式Observer(观察者模式)
    编译android源码三(编译系统)
    centos 6.3 修改默认的系统语言
    Linux下查看文件和文件夹大小的df和du命令
    编译android源码二(下载源代码)
    devenv.exe
    Javascript和xml合用
    DataKeys的用法
    XSL(转)
  • 原文地址:https://www.cnblogs.com/lyl-312/p/5515003.html
Copyright © 2011-2022 走看看