1.实现strcpy 2.实现strcat 3.实现strstr 4.实现strchr 5.实现strcmp 6.实现memcpy 7.实现memmove
1.实现strcpy
把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>char *mystrcpy(char *str2, const char *str1)
{assert(str1 != NULL);assert(str2 != NULL);char *r = str2;while ((*r++ = *str1++) != '\0');return r;
}int main()
{char str1[] = "abcdef";char str2[] = { 0 };mystrcpy(str2, str1);strcpy(str2, str1);printf("%s\n", str2);printf("%s\n", str2);return 0;
}
2.实现strcat
把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除*dest原来末尾的“\0”)。要保证*dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。返回指向dest的指针。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>char *mystrcat(char *str2, const char *str1)
{assert(str1);assert(str2);char *r = str2;while (*str2 != '\0'){str2++;}while (*str2++ = *str1++);return str2;
}int main()
{char str1[] = "def";char str2[] = "abc";mystrcat(str2, str1);strcat(str2, str1);printf("%s\n", str2);printf("%s\n", str2);return 0;
}
3.实现strstr
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
#include <stdio.h>
#include <string.h>char *mystrstr(const char *str1, const char *str2)
{char *cp = (char*)str1;char *s1, *s2;if (!*str2)return((char *)str1);while (*cp){s1 = cp;s2 = (char *)str2;while (*s1 && *s2 && !(*s1 - *s2))s1++, s2++;if (!*s2)return(cp);cp++;}return(NULL);
}int main()
{char str1[] = "1234xyz";char str2[] = "34";printf("%s\n", mystrstr(str1, str2));printf("%s\n", strstr(str1, str2));return 0;
}
4.实现strchr
strchr函数功能为在一个串中查找给定字符的第一个匹配之处。函数原型为:char *strchr(const char *str, int c),即在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。
#include <stdio.h>
#include <string.h>char *mystrchr(const char *str, int c)
{while (*str != '\0' && *str!= c){++str;}return (*str == c )? str : NULL;
}int main()
{char str[] = "abcdefd";char c = 'd';printf("%s\n", mystrchr(str, c));printf("%s\n", strchr(str, c));return 0;
}
5.实现strcmp
strcpy是一种C语言的标准库函数,strcpy把含有'\0'结束符的字符串复制到另一个地址空间,返回值的类型为char*。
#include <stdio.h>
#include <string.h>
#include <assert.h>int mystrcmp(const char *str1, const char *str2)
{while (*str1 == *str2){assert((str1 != NULL) && (str2 != NULL));if (*str1 == '\0')return 0;str1++;str2++;}if (*str1 > *str2)return 1;elsereturn -1;
}int main()
{char str1[] = "abcdefd";char str2[] = "abcd";printf("%d\n", mystrcmp(str1, str2));printf("%d\n", strcmp(str1, str2));return 0;
}
6.实现memcpy
memcpy指的是C和C++使用的内存拷贝函数,函数原型为void *memcpy(void *destin, void *source, unsigned n);函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从源source中拷贝n个字节到目标destin中。
#include <stdio.h>
#include <string.h>
#include <assert.h>void *mymemcpy(void * dst, const void * src, size_t count)
{void * ret = dst;assert(dst);assert(src);while (count--){*(char *)dst = *(char *)src;dst = (char *)dst + 1;src = (char *)src + 1;}return(ret);
}int main()
{const char *s1 = "hello";int a = sizeof(s1);char s2[1024]= { 0 };mymemcpy(s2, s1, strlen(s1));printf("%s\n", s2);memcpy(s2, s1, strlen(s1));printf("%s\n", s2); return 0;
}
7.实现memmove
memmove用于拷贝字节,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,但复制后源内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
#include <stdio.h>
#include <string.h>
#include <assert.h>void *mymemmove(void * dst, const void * src, size_t count)
{void * ret = dst;if (dst <= src || (char *)dst >= ((char *)src + count)){while (count--){*(char *)dst = *(char *)src;dst = (char *)dst + 1;src = (char *)src + 1;}}else{dst = (char *)dst + count - 1;src = (char *)src + count - 1;while (count--){*(char *)dst = *(char *)src;dst = (char *)dst - 1;src = (char *)src - 1;}}return(ret);
}int main()
{char buffer1[] = "abcdef";char buffer2[] = "ddadfg";mymemmove(buffer1, buffer2, sizeof(buffer1));printf("%s\n", buffer1);memmove(buffer1, buffer2, sizeof(buffer1));printf("%s\n", buffer1);return 0;
}
1.实现strcpy 2.实现strcat 3.实现strstr 4.实现strchr 5.实现strcmp 6.实现memcpy 7.实现memmove
1.实现strcpy
把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>char *mystrcpy(char *str2, const char *str1)
{assert(str1 != NULL);assert(str2 != NULL);char *r = str2;while ((*r++ = *str1++) != '\0');return r;
}int main()
{char str1[] = "abcdef";char str2[] = { 0 };mystrcpy(str2, str1);strcpy(str2, str1);printf("%s\n", str2);printf("%s\n", str2);return 0;
}
2.实现strcat
把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除*dest原来末尾的“\0”)。要保证*dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。返回指向dest的指针。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>char *mystrcat(char *str2, const char *str1)
{assert(str1);assert(str2);char *r = str2;while (*str2 != '\0'){str2++;}while (*str2++ = *str1++);return str2;
}int main()
{char str1[] = "def";char str2[] = "abc";mystrcat(str2, str1);strcat(str2, str1);printf("%s\n", str2);printf("%s\n", str2);return 0;
}
3.实现strstr
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
#include <stdio.h>
#include <string.h>char *mystrstr(const char *str1, const char *str2)
{char *cp = (char*)str1;char *s1, *s2;if (!*str2)return((char *)str1);while (*cp){s1 = cp;s2 = (char *)str2;while (*s1 && *s2 && !(*s1 - *s2))s1++, s2++;if (!*s2)return(cp);cp++;}return(NULL);
}int main()
{char str1[] = "1234xyz";char str2[] = "34";printf("%s\n", mystrstr(str1, str2));printf("%s\n", strstr(str1, str2));return 0;
}
4.实现strchr
strchr函数功能为在一个串中查找给定字符的第一个匹配之处。函数原型为:char *strchr(const char *str, int c),即在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。
#include <stdio.h>
#include <string.h>char *mystrchr(const char *str, int c)
{while (*str != '\0' && *str!= c){++str;}return (*str == c )? str : NULL;
}int main()
{char str[] = "abcdefd";char c = 'd';printf("%s\n", mystrchr(str, c));printf("%s\n", strchr(str, c));return 0;
}
5.实现strcmp
strcpy是一种C语言的标准库函数,strcpy把含有'\0'结束符的字符串复制到另一个地址空间,返回值的类型为char*。
#include <stdio.h>
#include <string.h>
#include <assert.h>int mystrcmp(const char *str1, const char *str2)
{while (*str1 == *str2){assert((str1 != NULL) && (str2 != NULL));if (*str1 == '\0')return 0;str1++;str2++;}if (*str1 > *str2)return 1;elsereturn -1;
}int main()
{char str1[] = "abcdefd";char str2[] = "abcd";printf("%d\n", mystrcmp(str1, str2));printf("%d\n", strcmp(str1, str2));return 0;
}
6.实现memcpy
memcpy指的是C和C++使用的内存拷贝函数,函数原型为void *memcpy(void *destin, void *source, unsigned n);函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从源source中拷贝n个字节到目标destin中。
#include <stdio.h>
#include <string.h>
#include <assert.h>void *mymemcpy(void * dst, const void * src, size_t count)
{void * ret = dst;assert(dst);assert(src);while (count--){*(char *)dst = *(char *)src;dst = (char *)dst + 1;src = (char *)src + 1;}return(ret);
}int main()
{const char *s1 = "hello";int a = sizeof(s1);char s2[1024]= { 0 };mymemcpy(s2, s1, strlen(s1));printf("%s\n", s2);memcpy(s2, s1, strlen(s1));printf("%s\n", s2); return 0;
}
7.实现memmove
memmove用于拷贝字节,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,但复制后源内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
#include <stdio.h>
#include <string.h>
#include <assert.h>void *mymemmove(void * dst, const void * src, size_t count)
{void * ret = dst;if (dst <= src || (char *)dst >= ((char *)src + count)){while (count--){*(char *)dst = *(char *)src;dst = (char *)dst + 1;src = (char *)src + 1;}}else{dst = (char *)dst + count - 1;src = (char *)src + count - 1;while (count--){*(char *)dst = *(char *)src;dst = (char *)dst - 1;src = (char *)src - 1;}}return(ret);
}int main()
{char buffer1[] = "abcdef";char buffer2[] = "ddadfg";mymemmove(buffer1, buffer2, sizeof(buffer1));printf("%s\n", buffer1);memmove(buffer1, buffer2, sizeof(buffer1));printf("%s\n", buffer1);return 0;
}