my_strlen()
求字符串长度
遇到’\0’结束,不算’\0’
主函数
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int main()
{
char arr[] = "abcdef";
printf("%d\n",my_strlen(arr));
system("pause");
return 0;
}
第一种方法:(设置计数器)
int my_strlen(const char *str)
{
int len = 0;
assert(str!=NULL);
while (*str != '\0')
{
str++;
len++;
}
return len;
}
第二种方法:(递归)
int my_strlen(const char *str)
{
if (*str == '\0')
return 0;
else
return 1 + my_strlen(str + 1);
}
第三种方法:(指针-指针)
int my_strlen(const char *str)
{
char *p = str;
assert(str!=NULL);
while (*p != '\0')
{
p++;
}
return p - str;
}
my_strcpy()
字符串拷贝
要拷贝’\0’,不要遗漏
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char *my_strcpy(char *dest,const char *src)
{
char *ret = dest;
assert(dest != NULL);
assert(src != NULL);
while (*dest++=*src++)
{
;
}
return ret;
}
int main()
{
char arr1[10] = { 0 };
char arr2[] = "abcdef";
printf("%s\n", my_strcpy(arr1, arr2));
system("pause");
return 0;
}
my_strcat()
字符串连接函数
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char *my_strcat(char*dest, const char *src)
{
assert(dest != NULL);
assert(src != NULL);
char *ret = dest;
//找到'\0'
while (*dest != '\0')
{
dest++;
}
//拷贝
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abc";
printf("%s\n", my_strcat(arr1, arr2));
system("pause");
return 0;
}
my_strstr()
判断字符串str2是否是str1的子串
1.如果是,则该函数返回str2在str1中首次出现的地址
2.如果不是,返回NULL
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char *my_strstr(const char *str, const char *substr)
{
char *s1 = str;
char *s2 = substr;
char *cur = str;
while (*cur != '\0')
{
s1 = cur;
s2 = substr;
while (*s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return cur;
}
cur = cur + 1;
}
return NULL;
}
int main()
{
char arr1[] = "ababcabcd";
char arr2[] = "abca";
printf("%s\n", my_strstr(arr1, arr2));
system("pause");
return 0;
}
my_strcmp()
逐个比较
出现不等,就得出比较结果
1.相等返回0
2.不等的情况,大于返回正数,小于返回负数
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int my_strcmp(const char *p, const char *q)
{
assert(p != NULL);
assert(q != NULL);
while (*p == *q)
{
if (p == '\0')
return 0;
;
p++;
q++;
}
if (*p > *q)
return 1;
else
return -1;
/*return *p - *q;*/
}
int main()
{
char arr1[] = "abcdf";
char arr2[] = "abcdh";
printf("%d\n", my_strcmp(arr1, arr2));
system("pause");
return 0;
}
my_memcpy()
内存拷贝函数
主函数
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int main()
{
int arr1[] = { 1, 2, 3, 4, 5, 6 };
int arr2[] = { 9, 8, 7, 6, 5 };
my_memcpy(arr1 + 2, arr2, 3 * sizeof(arr2[0]));
system("pause");
return 0;
}
第一种:
void *my_memcpy(void *dest, void *src, size_t sz)
{
assert(dest != NULL);
assert(src != NULL);
char *pdest = (char *)dest;
char *psrc = (char *)src;
unsigned int i = 0;
for (i = 0; i < sz; i++)
{
*pdest = *psrc;
pdest++;
psrc++;
}
return dest;
}
第二种:
void *my_memcpy(void *dest, void *src, size_t sz)
{
assert(dest != NULL);
assert(src != NULL);
unsigned int i = 0;
for (i = 0; i < sz; i++)
{
*(char *)dest = *(char *)src;
++(char *)dest;
++(char *)src;
}
return dest;
}
第三种:
void *my_memcpy(void *dest, void *src, size_t sz)
{
assert(dest != NULL);
assert(src != NULL);
unsigned int i = 0;
for (i = 0; i < sz; i++)
{
*(char *)dest = *(char *)src;
dest=(char *)dest+1;
src = (char *)src + 1;
}
return dest;
}
my_memmove()
从src拷贝count个字节到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改
主函数
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int main()
{
int arr1[] = { 1, 2, 3, 4, 5, 6 };
my_memcpy(arr1 + 2, arr2, 3 * sizeof(arr2[0]));
system("pause");
return 0;
}
实现
void *my_memmove(void *dest, void *src, size_t sz)
{
void* ret = dest;
//从前向后拷贝
if (src > dest)
{
while (sz--)
{
*((char *)dest) = *((char *)src);
dest = (char *)dest + 1;
src = (char *)src + 1;
}
}
//从后向前拷贝
else
{
while (sz--)
{
*((char *)dest+ sz) = *((char *)src+sz);
}
}
return ret;
}