一、库函数的实现
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.实现任意长度整数相加