C中常用库函数的简单实现

32 篇文章 0 订阅

通常要考虑这几个方面

参数中的源数据,目标空间

返回值

空间是否足够

源数据与目标空间是否有重叠


以下是自己写的,有些没验证,估计有BUG



strlen

size_t strlen(char const *str)
{
       int len=0;
       while(*str++!='\0')// strlen不计算\0,sizeof则需要计算//\0可以省去 
              len++;
       return len;
}


strcpy

char* strcpy(char *dst,char const *src)
 {
   char *r=dst;
   while((*d++=*s++)!='\0');//\0可以省去 
   return r;
 }


strncpy

char* strncpy(char *dst,char const *src,size_t n)
 {
   char *r=dst;
    int i=0;
   while(i++<n&&(*dst++=*src)!='\0');// strncpy如果COPY数目到n则终止,末尾可能不是\0(返回的值可能不算是字符串了)
    
    while(i++<n)// 如果在n前已经遇到\0,则后续继续用\0填充
    {
                *dst++='\0';
    }                           
                                 
   return r;
 }

strcat

char* strcat(char *dst,char const *src)
{
      char *r=dst;
      while(*dst)//  找到\0位置 
      {
                 *dst++;
      }
      while(*dst++=*src++);
      return r;      
}
strncat

char* strncat(char *dst,char const *src,size_t n)
{
      char *r=dst;
      while(*dst)//  找到\0位置 
      {
                 dst++;
      }
      int i=0;
      while(i++<n&&*dst=*src++)
      {
                               if(*dst=='\0')break;// 保证dst指向需要追加的\0位置 
                               dst++;
      }
      *dst='\0';// 如果是到n则最后添加\0,如果是遇到\0 break,再覆盖一次       
      
      return r;      
}

strcmp

int strcmp(char const *s1, char const *s2)
{
    while (*s1==*s2)
    {
        if(*s1=='\0')
            return 0;
        s1++;
        s2++;
     }
    // return *s1-*s2;// 不同编译器可能不一样
    return *s1<*s2?-1:1;
}

strncmp
int strncmp(char const *s1, char const *s2,size_t n)
{
    int i=0;
    while(i++<n)
    {
              if(*s1!=*s2)
                           return *s1-*s2;
              s1++;
              s2++;
    }
    return 0;
   
}

strchr

char* strchr(char const *s,char c)
{ 
  while(*s != '\0' && *s != c) 
  {
    s++;
  } 
  return *s == c ?s:NULL;
}

strpbrk

char * strpbrk(const char * cs,const char * ct)
{
    const char *sc1,*sc2;
    for( sc1 = cs; *sc1 != '\0'; ++sc1) {
        for( sc2 = ct; *sc2 != '\0'; ++sc2) {
        if (*sc1 == *sc2)
            return (char *) sc1;
        }
    }
    return NULL;
}


strstr

char *  strstr (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;

}


strspn返回字符串中第一个不在指定字符串中出现的字符下标

size_t strspn (const char *s,const char * accept);

strcspn返回字符串s1中第一个在s2中出现的字符的下标值

size_t strcspn(const char *s1,const char *s2);

strtok分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串

char *strtok(char s[], const char *delim);// strtok会修改源数据


memcpy

void * memcpy(void *dst, const void *src, size_t n)
{
     void *ret=dst;
     while (n--) {
                *(char *)dst = *(char *)src;
                dst = (char *)dst + 1;
                src = (char *)src + 1;
     }
     return ret;
}


memset

void * memset(void *s, int ch, size_t n)
{
     void *ret=s;
     while(n--)
     {
               *(char*)s=(char)ch;
               s=(char*)s+1;
     }
     return ret;
}



memmove

memcmp

memchr



atoi

atol

strtol

strtoul


assert是<assert.h>中的宏,当定义了#define NDEBUG后会关闭assert调试


void *malloc(size_t size);

void free(void* ptr);

void *calloc(size_t num_elements,size_t element_size);//分配的同时会将元素置0,参数设定的方式不同

void  *realloc(void*ptr,size_t new_size);// 可以调整原来申请的空间大小 ,如果原内存不能修改大小,则会分配新的内存,第一个参数置为NULL,即malloc的作用


常量区的使用,指针操作,数组操作都可以

putchar("0123456789ABCDEF"[value%16]);// 转换16进制数输出的一行代码搞定

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值