C语言部分常用库函数的作用及其模拟实现

1.strlen:

头文件:

函数原型:size_t strlen (const char *str)

作用: 计算一个字符串 (字符数组)中元素的个数,即从数组头部计数,直到遇到字符串结束符"\0"为止,计数结果不包括0.

//计数器方式
int my_strlen(const char * str)
{
 int count = 0;
 while(*str)
 {
  count++;
  str++;
 }
 return count;
}

//不能创建临时变量计数器
int my_strlen(const char * str)
{
 if(*str == '\0')
  return 0;
 else
  return 1+my_strlen(str+1);
}

//指针-指针的方式
int my_strlen(char *s)
{
   char *p = s;
   while(*p != ‘\0’ )
       p++;
   return p-s;
}

2.strcpy:

头文件:

函数原型:char *strcpy(char *Dest, const char *Src)

作用: 把含有"\0"结束符的字符串复制到另一个地址空间,返回值类型为char*

char* my_strcpy(char* dest,const char* src)
{
    char* start = dest;
    assert(dest && src);
    while (*dest++ = *src++)
    {
        ;
    }
    return start;
}

3.strcmp:

头文件:

函数原型:int strcmp(char str1,char str2)

作用: 对两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到‘\0’为止。如果全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。

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

4.strcat:

头文件:

函数原型:char*strcat(char* strDestination, const char* strSource)

作用: 把 strSource(源头字符串)所指向的字符串追加到 strDestination(目的地字符串)所指向的字符串的结尾,所以必须要保证 strDestination 有足够的内存空间来容纳两个字符串,否则会导致溢出错误。

char *my_strcat(char *dest, const char*src)
{
 char *ret = dest;
 assert(dest != NULL);
 assert(src != NULL);
 while(*dest)
 {
  dest++;
 }
 while((*dest++ = *src++))
 {
  ;
 }
 return ret;
}

5.strstr:

头文件:

函数原型: char* strstr (const char* str1,const char* str2)

函数用于判断字符串str2是否是str1的子串。 如果是, 则该函数返回str2在str1中首次出现的地址;否则,返回NULL。

char* my_strstr(const char* str1, const char* str2)
{
    assert(str1 && str2);
    if (str2 == '\0')
        return str1;
    char* s1 = NULL;
    char* s2 = NULL;
    char* cp = str1;
    while (*cp)
    {
        s1 = cp;
        s2 = str2;
        while (s1 != '\0' && s2 != '\0' && *s1 == *s2)
        {
            s1++;
            s2++;
        }
        if (*s2 == '\0')
        {
            return cp;
        }
        cp++;
    }
}

6.memcpy:

头文件:

函数原型:void *memcpy(void*dest, const void *src, size_t n);

作用:由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。

void* my_memcpy(void* str1, void* str2,size_t num)
{
    void* ret = str1;
    assert(str1 && str2);
    while (num--)
    {
        *(char*)str1 = *(char*)str2;
        str1 = (char*)str1 + 1;//++(char*)str1;
        str2 = (char*)str2 + 1;//++(char*)str2;


    }
    return ret;
}

7.memmove

头文件:

函数原型:void *memmove(void *dest, const void *src, unsigned int count)

作用:由src所指内存区域复制count个字节到dest所指内存区域

void* my_memmove(void* str1, void* str2, size_t num)
{
    void* ret = str1;
    assert(str1 && str2);
    if (str1 < str2)
    {
        while (num--)
        {
            *(char*)str1 = *(char*)str2;
            str1 = (char*)str1 + 1;//++(char*)str1;
            str2 = (char*)str2 + 1;//++(char*)str2;


        }
    }
    else
    {
        while (num--)
        {
            *((char*)str1 + num) = *((char*)str2 + num);
        }
    }
    return ret;
}

8.strerror

头文件:

函数原型:char*strerror(int errnum)

1.库函数调用失败的时候会产生错误码,而每一个错误码对应着一条错误信息,strerror函数的作用就是将错误码给转化成错误信息。

2.在C语言中有一条全局的错误码errno,在程序运行过程中,只要库函数调用失败,我们就会把此处产生的错误码放入变量errno中。

3.返回值和参数:char * strerror ( int errnum );该函数的参数就是一个错误码,输入该错误码后,经函数内部处理,将该错误码转化成一条错误信息(类型是字符串)并将该错误信息(字符串)的地址返回。

————————————————

版权声明:本文为CSDN博主「乌龙茶QAQ」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/codezhu/article/details/118877528

9.perror

头文件:

函数原型:void perror(const char*str)

作用:直接打印错误信息,在打印错误信息前会先打印自定义的信息

10.memset

头文件:

函数原型:void*memset(void*ptr,int value,size_t num)

作用:作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。

你可能感兴趣的:(c语言,c++,开发语言)