模拟实现部分库函数(strcpy,strcmp,strcat,strstr,memcpy,memmove,memset)

//1.strcpy(拷贝)
char* my_strcpy(char*dst, const char*src)
{
 assert(dst);
 assert(src);
 char* cp = dst;
 while (*cp++ = *src++)
 {
  ;
 }
 return dst;
}
//2.strcat(连接)
char* my_strcat(char*dst, const char*src)
{
 assert(dst);
 assert(src);
 char* cp = dst;
 while (*cp != ‘\0‘)
 {
  cp++;
 }
 while (*cp++ = *src++)
 {
  ;
 }
 return dst;
}
//3.strcmp(比较)
int my_strcmp(const char*dst, const char*src)
{
 assert(dst);
 assert(src);
 int ret = 0;
 while (!(ret=*(unsigned char*)dst - *(unsigned char*)src) && *dst)
 {
  dst++;
  src++;
 }
 if (ret > 0)
 {
  ret = 1;
 }
 else if (ret < 0)
 {
  ret = -1;
 }
 return ret;
}
//4.strstr (寻找子串)
char* my_strstr(const char*dst, const char*src)
{
 char* cp = (char*)src;
 char*s1;
 char*s2;
 if (!*dst)
 {
  return ((char*)src);
 }
 while (*cp)
 {
  s1 = cp;
  s2 = (char*)dst;
  while (!(*s1-*s2)&&*s1&&s2)
  {
   s1++;
   s2++;
  }
  if (!*s2)
  {
   return (cp);
  }
  cp++;
 }
 return (NULL);
}
//5.memcpy(内存拷贝,不重叠)
void* my_memcpy(void *dst, const void*src, size_t count)
{
 assert(dst);
 assert(src);
 char*ret = (char*)dst;
 while (count--)
 {
  *(char*)dst = *(char*)src;
  dst = (char*)dst + 1;
  src = (char*)src + 1;
 }
 return ret;
}
//6.memmove(内存移动,实现重叠拷贝)
//内存移动有两种情况:如有一字符串:abcdefgh ,若dst<src,即dst在src前面,则没有重叠。
//若dst>src,即dst在src后面,此时若srt+count<dst,则没有重叠。
//若dst>src,即dst在src后面,此时若srt+count>dst,则有重叠,此时需从后向前,由src+count开始拷贝到dst+count。
void *my_memmove(void*dst, const void*src, size_t count)
{
 assert(dst);
 assert(src);
 void *ret = dst;
 if ((dst < src) || ((char*)src + count) < (char*)dst)     //内存不重叠,顺着按顺序拷贝
 {
  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;
}
//7.memset(内存设置)
void* my_memset(void*dst, int val, size_t count)
{
 void*start = dst;
 while (count--)
 {
  *(char*)dst = (char)val;
  dst = (char*)dst + 1;
 }
 return start;
}
时间: 2024-08-10 02:09:57

模拟实现部分库函数(strcpy,strcmp,strcat,strstr,memcpy,memmove,memset)的相关文章

C基础--字符串操作函数(strlen,strcpy,strcmp,strcat,strstr,strtok)

#include <stdio.h> #include <string.h> int main(void) { //char dest[10]; //#define NULL (void *)0 //char *dest = NULL; //dest是野指针,指向的区域没有可读写空间 //char dest[3]; //char src[] = "hello"; char str1[10] = "hello"; //char str2[10]

教教大家一些strcpy,strcmp,strcat,strlen函数的写法

VC源码: strcmp函数的写法: #include<stdio.h> #include<string.h> int strcmp1(char* a, char* b) { for(;*a==*b;a++,b++) if(*a!='\0') return 0; return *a - *b; } main() {  int l; char a[10]={"db"}; char b[10]={"cb"}; l=strcmp1(a,b); pr

实现字符串函数,strlen(),strcpy(),strcmp(),strcat()

1 #include<stdio.h> 2 #include<stdlib.h> 3 4 int my_strlen(char *str); 5 char *my_strcpy(char *dest, char *src); 6 char *my_strcat(char *dest, char *src); 7 int my_strcmp(char *str1,char *str2); 8 9 int main() 10 { 11 char dest[32] = "che

转载 C++常用库函数atoi,itoa,strcpy,strcmp的实现

C++常用库函数atoi,itoa,strcpy,strcmp的实现 C语言字符串操作函数 1. 字符串反转 - strRev2. 字符串复制 - strcpy3. 字符串转化为整数 - atoi4. 字符串求长 - strlen5. 字符串连接 - strcat6. 字符串比较 - strcmp7. 计算字符串中的元音字符个数8. 判断一个字符串是否是回文1. 写一个函数实现字符串反转 版本1 - while版 void strRev(char *s){    char temp, *end 

C语言标准库函数strcpy与strcmp的简单实现

1 //C语言标准库函数strcpy的一种简单实现. 2 3 //返回值:目标串的地址. 4 5 //对于出现异常的情况ANSI-C99标准并未定义,故由实现者决定返回值,通常为NULL. 6 7 //参数:des为目标字符串,source为原字符串. 8 9 char* strcpy(char* des,const char* source) 10 { 11 char* r=des; 12 13 assert((des != NULL) && (source != NULL)); 14

strlen,strcat,strcpy,strcmp的实现

自己设计实现strlen,strcat,strcpy,strcmp. int my_strlen(char *a) { int count=0; while(*a) { a++; count++; } return count; } char* my_strcat(char *a,char *b) { char *c; c=a; while(*a) { a++; } while(*b) { *a++=*b++; } return c; } char* my_strcpy(char *c,char

strcpy,strncpy, strlen, strcmp strcat函数实现

#include <stdio.h> #include <assert.h> char* strcpy(char* strDest, const char* strSrc) { assert((strDest != NULL) && (strSrc != NULL)); char* address = strDest; while((*strDest++ = *strSrc++) != '\0') NULL; return address; } char* strn

strlen strcat strcpy strcmp 自己实现

strlen strcat strcpy strcmp 自己实现 strlen include <stdio.h> #include <string.h> #include <assert.h> size_t my_strlen(const char* str){ assert(str != NULL); const char *tmp = str; size_t count = 0; while(*tmp++ != '\0'){ count++; } return c

各种字符串函数(strcpy,strcmp,strlen)之深度剖析

//字符串复制函数1 void strcpy1(char str1[], char str2[]){ int i = 0; for (; str2[i] != '\0'; i++){ str1[i] = str2[i]; } str1[i] = '\0'; } //2 void strcpy2(char str1[], char str2[]){ int i = 0; while (str1[i] = str2[i])i++; } //字符串长度函数1 int strlen1(char str[