常用字符串函数的实现

19 篇文章 0 订阅

一、库函数的实现

1.strcpy

#include<stdio.h>
#include<assert.h>
//1.strcpy*******
char* strcpy(char* dest, const char* source)
{
	assert((dest != NULL) && (source != NULL));
	char* res = dest;
	while ((*dest++ = *source++) != '\0');
	return res;
}

2.strcat

//2.strcat*******
char* strcat(char* dest, const char* source)
{
	assert((dest != NULL) && (source != NULL));
	char* s = dest;
	while (*s != '\0') 
		s++;
	while (*source != '\0') *s++ = *source++;
	*s = '\0';
	return dest;
}

3.memcpy

//3.memcpy*******
//typedef unsigned int size_t
void* memcpy(void* dest, const void* source, size_t size)
{
	void* ret = dest;
	while (size--)
	{
		*(char*)dest = *(char*)source;
		dest = (char*)dest + 1;
		source = (char*)source + 1;
	}
	return ret;
}

4.memmove

//4.memmove*******
//dest区域和source区域有重叠,且dest在source之后,就会出现部分被覆盖;
//既然dest在前source在后不会出错,那么久反过来拷贝(从尾部向前复制)
void* memmove(void* dest, const void* source, size_t size)
{
	assert((dest != NULL) && (source != NULL));
	char* tmp_dest = (char*)dest;
	char* tmp_source = (char*)source;
	if (tmp_source + size < tmp_dest || tmp_dest + size < tmp_source)
	{
		while (size--)
		{
			*tmp_dest++ = *tmp_source++;
		}
		
	}
	else
	{
		tmp_dest += size - 1;
		tmp_source += size - 1;
		while (size--)
		{
			*tmp_dest-- = *tmp_source--;
		}
	}
	return dest;
}

5.strcmp

//5.strcmp*******
int strcmp(const char* str1, const char* str2)
{
	int ret = 0;
	while (!(ret = *(unsigned*)str1 - *(unsigned*)str2) && *str2)
	{
		++str1;
		++str2;
	}
	if (ret < 0)
		ret = -1;
	else if (ret > 0)
		ret = 1;
	return ret;
}

6.strstr

kmp :https://blog.csdn.net/dyx404514/article/details/41314009

https://blog.csdn.net/v_july_v/article/details/7041827

7.atoi

//6.atoi
int atoi(const char* str)
{
	int tmp = 0;
	const char* ptr = str;
	if (*str == '+' || *str == '-')
	{
		str++;
	}
	while (*str != 0)
	{
		if (*str < '0' || *str > '9')
		{
			break;
		}
		tmp = tmp * 10 + (*str - '0');
		str++;
	}
	if (*ptr == '-')
	{
		tmp = -tmp;
	}
	return tmp;
}

8.itoa

二、常见的字符串操作

1.反转字符串  344. 反转字符串

class Solution {
public:
    void reverseString(vector<char>& s) {
        int cnt = s.size();
        for(int i = 0; i < cnt/2; ++i){//注意:这里终止条件为i < cnt/2,而不是i < cnt
            //swap(s[i], s[cnt-1-i]);
            char tmp = s[i];
            s[i] = s[cnt-1-i];
            s[cnt-1-i] = tmp;
        }
    }
};

2.字符串中的单词反转  151. 翻转字符串里的单词

class Solution {
public:
    string reverseWords(string &s) {
        string res;
        int len = s.size();
        int end = len-1;
        if(len <= 0) return res;
        for(int i = len -1; i >= 0; --i)//从后往前遍历
        {
            if(s[i] != ' ' && i < len-1 && s[i+1] == ' ')//遇到下一个单词,end移动到单词的尾部
            {
                    end = i;
            }
            if((s[i] != ' ' && i > 0 && s[i-1] == ' ' )|| (i == 0 && s[i] != ' '))//i从后往前移动到一个单词结束的时候
            {
                for(int j = i; j <= end; ++j)
                {
                    res+=s[j];
                }  
                res+=' ';
            }  
           // if(s[i] == ' ' && i > 0 && s[i-1] == ' ') continue;
        }
        if(res.size() > 0)
        res.resize(res.size()-1);
        return res;
    }
};

3.判断是否回文字符串

4.实现任意长度整数相加

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值