字符串函数手写实现:strlen(), strcpy(), strstr(), strcat(), strcmp(), memcpy()

  • strlen()函数

功能:计算给定字符串的(unsigned int型)长度,不包括'\0'在内

int strlen(const char *str) {
	assert(str != NULL);
 
	int len = 0;
	while( (*str++) != '\0')
		len++;
 
	return len;
}
  • strcpy()函数

功能:字符串复制函数,strcpy把含有'\0'结束符的字符串复制到另一个地址空间,返回值的类型为char*。

char *strcpy(char *strDes, const char *strSrc) {
	if(strSrc == NULL || strDes == NULL)
		return NULL;
 
	char *address = strDes;
 
	while( (*strDest++ = *strSrc++) != '\0');
 
	return address;
 
 }
  • strcat()函数

功能:把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除*dest原来末尾的“\0”)。要保证*dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。返回指向dest的指针

char* strcat(char* strDest, const char* strSrc) {
	char* address = strDest;
	assert( (strDest != NULL) && (strSrc != NULL) );
 
	while(*strDest != '\0')	//当strDest='\0'时结束,即为字符串的结尾,将strSrc添加到此处
		strDest++;
 
	while(*strSrc != '\0')
		*strDest++ = *strSrc++;
 
	*strDest = '\0';
 
	return address;
}
  • strcmp()函数

功能:对两个字符串进行比较,若s1、s2字符串相等,则返回零;若s1大于s2,则返回正数;否则,则返回负数。

int strcmp(const char* str1, const char* str2) {
	assert( (str1 != NULL) && (str2 != NULL) );
	int ret = 0;
 
	while( !(ret = *(unsigned char*)str1 - *(unsigned char*)str2) && *str1 ) {//ret=0,相等,相等时要确定两个字符不为'\0';  ret!=0时,循环结束,判断ret值
		str1++;
		str2++;
	}
 
	if(ret > 0)
		return 1;
 
	else if(ret < 0)
		return -1;
 
	return 0;
}
  • memcpy()函数

功能::将str指向地址为起始地址的连续n个字节的数据复制到以dest指向地址为起始地址的空间内,函数返回一个指向dest的指针

void* memcpy(void *dest, const void *src, size_t n) {
	if(dest == NULL || src == NULL)
		return NULL;
 
	char* pdest = (char*)dest;
	char* psrc = (char*)src;
 
	while(n--)
		*pdest++ = *psrc++;
 
	return dest;
}

.

  • strstr()函数

功能:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。

    int strStr(string haystack, string needle) {
        int i = 0, j = 0;
        while(haystack[i] != '\0' && needle[j] != '\0')
        {
            if(haystack[i] == needle[j])
            {
                i++; j++;
            }
            else
            {
                i = i - j + 1;
                j = 0;
            }
        }
        if(j == strlen(needle.c_str()))
            return i - j;
        else return -1;

    }

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值