总结一下模拟的各种库函数

来源:互联网 发布:登陆淘宝账号 编辑:程序博客网 时间:2024/05/18 01:12
#include<stdio.h>
#include<string.h>
#include <assert.h>
1.模拟strcmp函数
int my_strcmp(const char *str1, const char *str2)  
 {


  assert(str1 != NULL);
  assert(str2);
 
  while(*str1 == *str2)
  {
  if(*str1 == '\0')
  return 0;
  str1++;
  str2++;
  }
  //return *str1-*str2;
  if(*str1 > *str2)
  return -1;
  else
  return 1;
 }


2.模拟strncmp函数
 
int my_strcmp(const char *dest, const char *src, int len)
{
    assert(dest);
    assert(src);
    while (len--)
    {
        if (*dest == *src)
        {
            dest++;
            src++;
        }
    }
    if (len == 0)
        return 0;
    else
       if(*str1 > *str2)
  return -1;
  else
  return 1;
}
 
 
int main()
{
    char arr1[] = "abcdeff";
    char arr2[] = "abcd";
    int len = sizeof(arr1) / sizeof(arr1[0]);
    int ret = my_strcmp(arr1, arr2, len);
    printf("%d", ret);
    system("pause");
    return 0;
}
 int main()
 {
int ret=0;
  char *p1 = "abcd";
  char *p2 = "abc";
  ret=my_strcmp(p1, p2);
printf("%d",ret);
  return 0;
 }
 3.模拟strcat




char *my_strcat(char* dest, const char* src)
{
char *ret = dest;
assert(dest != NULL);
assert(src != NULL);
//找目标的‘\0’
while(*dest != '\0')
{
dest++;
}
//拷贝
while(*dest++=*src++)
{
;
}
/*while(*src != '\0')
{
*dest++ = *src++;
}*/
return ret;
}
int main()
{
char arr[20] = "hello ";
//strcat(arr, "bit.");
my_strcat(arr, "bit.");
printf("%s\n", arr);
return 0;
}




void* my_memcpy(void *dest, const void*src, size_t num)
{
void *ret = dest;
char *pdest = (char *)dest;
char *psrc = (char *)src;
assert(dest);
assert(src);


while(num--)
{
*pdest++ = *psrc++;
}
return ret;
}


int main()
{
int i=0;
int arr[] = {1,2,3,4,5,6,7,8,9,0};
int arr2[10] = {0};
/*strcpy((char *)arr2, (char *)arr);*/
my_memcpy(arr2, arr, sizeof(arr)); 
for(i=0;i<=9;i++)
printf ("%d",arr2[i]);
return 0;
}
4.模拟strncat
char *my_strncat(char *dest, char *src, int len)  
{   
char *ret = dest;  
    assert(dest);  
    assert(src);  
    while (*dest)  
    {  
        dest++;  
    }  
    while (len--)  
    {  
        *dest = *src;  
        dest++;  
        src++;  
    }  
    *dest = '\0';  
    return ret;  
}  
  
int main()  
{  
    char arr[20] = "hello ";  
    int len = strlen(arr);  
    char *ret = my_strncat(arr, arr, len-2);  
    printf("%s", arr);  
    /*system("pause");*/  
    return 0;  

5.模拟strcat
char* my_strcat(char* dest, const char* src)
{
char *ret = dest;
assert(dest != NULL);
assert(src != NULL);
//找目标的‘\0’
while(*dest != '\0')
{
dest++;
}
//拷贝
while(*dest++=*src++)
{
;
}
/*while(*src != '\0')
{
*dest++ = *src++;
}*/
return ret;
}
int main()
{
char arr[20] = "hello ";
//strcat(arr, "bit.");
my_strcat(arr, "bit.");
printf("%s\n", arr);
return 0;
}
6.模拟memcpy
void* My_memcpy(char* dest, const char* src, int count)  
{  
    assert(dest);  
    assert(src);  
  
    while (count--)  
    {  
        *dest ++ = *src ++;  
    }  
    return dest;  

int main()  
{  
    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };  
    int str[] = { 5, 6, 7, 8, 9, 0 };  
    int i = 0;  
    My_memcpy(arr, str, sizeof(str));  
    for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)  
    {  
        printf("%d ", arr[i]);  
    }  
    system("pause");  
    return 0;  
}  
7.模拟memmove


void *my_memmove(void *dest,const void *src,int n)  
{  
/*因为char类型为1字节,所以将数据转化为char* 
进行操作。并不是因为操作的对象是字符串*/  
char* pdest=(char *)dest;   
const char* psrc=(const char *)src;  
assert(dest);  
assert(src);  
if(pdest <= psrc&&pdest >=psrc+n)//正常情况下从前向后拷贝  
{  
    while(n--)  
    {  
        *pdest = *psrc;  
    }  
}  
else //当出现内存覆盖时从后向前拷贝  
{  
    while(n--)  
    {  
        *(pdest+n)=*(psrc+n);  
    }  
}   
  return dest;  
}  
  
int main()  
{  
    char arr[10]="abcdefg";  
    char arr0[10]="abcdefg";  
    char arr1[10]={0};  
    my_memmove(arr+2,arr,4);  
    my_memmove(arr1,arr0,4);  
    printf("内存覆盖情况:%s\n",arr+2);  
    printf("正常情况:%s\n",arr1);  
      
    return 0;  
}
8.模拟strcpy
char *my_strcpy(char *dest, char *src)
{
    assert(dest);
    assert(src);
    char *ret = dest;
    while ((*dest++ = *src++) )//连同‘\0’一起拷贝了
    {
        ;
    }
      
  
    *dest = '\0';
    return ret;
   
}
9.模拟strncpy
char* my_strncpy(char*dest, const char*src, int n)  
{  
assert(dest);  
assert(src);  
char*p = dest;  
while (n--)  
{  
*p++ = *src++;  
}  
*p = 0;  
return dest;  

int main()  
{  
    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };  
    int str[] = { 5, 6, 7, 8, 9, 0 };  
    int i = 0; 
int n=0;
scanf("%d",n);
     my_strncpy(arr, str,  len) 
    for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)  
    {  
        printf("%d ", arr[i]);  
    }  
     
    return 0;  
}
10.模拟strstr
#include <stdio.h>  
#include <assert.h>  
char * my_strstr( char *dst, const char * src)  
{  
    assert(dst);  
    assert(src);  
    int i, j, k;  
    for (i = 0; dst[i] != '\0'; i++)  
    {  
        for (j = i, k = 0; src[k] != '\0'&&dst[j] == src[k]; j++, k++)  
        {  
            ;  
        }  
        if (src[k] == '\0'&&k > 0)  
            return &dst[i];  
    }  
    return NULL;  
}  
int main()  
{  
    char *p1 = "abcdef";  
    char *p2 = "cde";  
    printf("%s\n", my_strstr(p1, p2));  
    return 0;  
}
0 0
原创粉丝点击