模拟实现strcmp、strstr、memcpy、memmove

本文模拟实现了C语言中的memmove、memcpy、strstr及strcmp等字符串操作函数,并提供了详细的代码示例,帮助读者理解这些函数的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <assert.h>
#include <windows.h>  
#include <stdlib.h>

#模拟实现memmove函数
void *my_memmove(void *dest,const void *src,size_t count)  
{  

 void *ret = dest;  
 assert(dest);  
 assert(src);  
 if((src<dest)&&((char*)dest<(char*)src+count))  
 {  
  while(count--)  
  {  
   *((char*)dest+count)=*((char*)src+count);  
  }  
 }  
 else  
 {  
  while(count--)  
  {  
   *(char*)dest=*(char*)src;  
   dest=(char*)dest+1;  
   src=(char*)src+1;  
  }  
 }  
 return ret;  
}  
int main()  
{  
 int i=0;  
 int arr[]={1,2,3,4,5,6,7,8,9,0};  
 int sz=sizeof(arr)/sizeof(arr[0]);  
    my_memmove(arr+3,arr,4*sizeof(int));  
    for(i=0;i<sz;i++)  
 {  
  printf("%d ",arr[i]);  
 }    
 return 0;  
}  

#模拟实现memcpy函数
void* my_memcpy(void* dest, const void* src,size_t count)  
{  
 void *ret = dest;  
 assert(dest);  
 assert(src);  
 while(count)  
 {  
  *(char *)dest = *(char *)src;  
  dest = (char *)dest+1;  
  src = (char *)src+1;  
  count--;  
 }  
 return ret;  
}  
int main()  
{  
 char arr[] = {"hello"};  
 char str[] = {"bit"};  
 int sz = sizeof(arr)/sizeof(arr[0]);  
 int i=0;  
 char *ret=my_memcpy(arr,str,7);  
 printf("%s\n",ret);  
 return 0;  
} 

#模拟实现strstr函数 
char *my_strstr(const char *str, char *string)
{
    int i=0;
    assert(str&&string);   
    while('\0'!=str)       
    { 
      while(1)
      {
        if(string[i]!=str[i])   
          break;
        if(string[i]=='\0')      
          return str;
        i++;
      }
      string++;
    }
    return NULL;
}

int main()
{
   char string[] = "bcde";
   char str[] = "abcdef"; 
   char *p=my_strstr(str,string);
   int result=p-str+1;    
   if(p!=NULL)  
       printf("%s found at position %d\n\n", string,result);
    else
       printf( "%s not found\n", string);
    return 0;
}


#模拟实现strcmp函数

int my_strcmp(const char *str1, const char *str2)  
{  
    assert(str1);  
    assert(str2);  
    while (*(str1) == *(str2))  
    {  
        if (*str1 == '\0')  
            return 0; 
        str1++;  
        str2++;  
    } 
    return *str1 - *str2;

}  
int main()  
{  
    char *p1 = "ab";  
    char *p2 = "abcd";       
    printf("%d\n", my_strcmp(p1, p2));                
    return 0;  
}  
1. atof(): 将字符串转换为double类型的值。 例如: ```c++ char str[] = "3.14"; double num = atof(str); printf("%f", num); ``` 结果为:3.140000 2. atoi(): 将字符串转换为int类型的值。 例如: ```c++ char str[] = "1234"; int num = atoi(str); printf("%d", num); ``` 结果为:1234 3. atol(): 将字符串转换为long类型的值。 例如: ```c++ char str[] = "1234567"; long num = atol(str); printf("%ld", num); ``` 结果为:1234567 4. strtod(): 类似于atof(),将字符串转换为double类型的值。 例如: ```c++ char str[] = "3.14"; double num = strtod(str, NULL); printf("%f", num); ``` 结果为:3.140000 5. strtol(): 将字符串转换为long类型的值,同时支持指定转换的基数(例如10进制、16进制等)和错误检查。 例如: ```c++ char str[] = "0110"; long num = strtol(str, NULL, 2); printf("%ld", num); ``` 结果为:6 6. strtoul(): 类似于strtol(),不过返回的是无符号的long类型。 例如: ```c++ char str[] = "0xA"; unsigned long num = strtoul(str, NULL, 16); printf("%lu", num); ``` 结果为:10 7. memset(): 将一段内存区域设置为指定的值。 例如: ```c++ char str[10]; memset(str, 'a', sizeof(str)); printf("%s", str); ``` 结果为:aaaaaaa 8. memcpy(): 将一段内存区域的内容复制到另一段内存区域。 例如: ```c++ char src[] = "hello"; char dst[10]; memcpy(dst, src, sizeof(src)); printf("%s", dst); ``` 结果为:hello 9. memmove(): 和memcpy()类似,但是保证在有重叠的情况下会正确工作。 例如: ```c++ char str[] = "hello"; memmove(str + 2, str, 3); printf("%s", str); ``` 结果为:hehlo 10. memcmp(): 比较两段内存区域的内容是否相等。 例如: ```c++ char str1[] = "hello"; char str2[] = "Hello"; int result = memcmp(str1, str2, 5); printf("%d", result); ``` 结果为:32(h和H的ASCII码差值) 11. memchr(): 在一段内存区域中搜索指定的字符,并返回指向该字符的指针。 例如: ```c++ char str[] = "hello"; char* ptr = (char*)memchr(str, 'l', 5); printf("%s", ptr); ``` 结果为:ll 12. strcpy(): 将一个字符串复制到另一个字符串。 例如: ```c++ char src[] = "hello"; char dst[10]; strcpy(dst, src); printf("%s", dst); ``` 结果为:hello 13. strncpy(): 类似于strcpy(),不过只会复制指定长度的字符。 例如: ```c++ char src[] = "hello"; char dst[10]; strncpy(dst, src, 3); dst[3] = '\0'; printf("%s", dst); ``` 结果为:hel 14. strcat(): 将一个字符串附加到另一个字符串的末尾。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; strcat(str1, str2); printf("%s", str1); ``` 结果为:helloworld 15. strncat(): 类似于strcat(),不过只会附加指定长度的字符。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; strncat(str1, str2, 3); printf("%s", str1); ``` 结果为:helloworld 16. strcmp(): 比较两个字符串是否相等。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; int result = strcmp(str1, str2); printf("%d", result); ``` 结果为:-15 17. strncmp(): 类似于strcmp(),不过只会比较指定长度的字符。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; int result = strncmp(str1, str2, 3); printf("%d", result); ``` 结果为:0 18. strchr(): 在一个字符串中搜索指定的字符,并返回指向该字符的指针。 例如: ```c++ char str[] = "hello"; char* ptr = strchr(str, 'l'); printf("%s", ptr); ``` 结果为:llo 19. strrchr(): 类似于strchr(),不过会从字符串的末尾开始搜索。 例如: ```c++ char str[] = "hello"; char* ptr = strrchr(str, 'l'); printf("%s", ptr); ``` 结果为:lo 20. strstr(): 在一个字符串中搜索指定的子字符串,并返回指向该子字符串的指针。 例如: ```c++ char str[] = "hello world"; char* ptr = strstr(str, "world"); printf("%s", ptr); ``` 结果为:world
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值