自己实现字符串操作函数strlen(),strcat(),strcpy(),strcmp()

时间:2021-11-02 16:11:04

1.strlen()函数是求解字符串的有效长度的

1)非递归实现

size_t my_strlen(const char *str)

{

     assert(str != NULL);  //断言,保证指针参数不能为空

     size_t count = 0;

     const char *pstr = str;   //参数保护

     while (*pstr++ != '\0')

    {

         count++;

    }

    return count;

}

2)非递归实现

size_t my_strlen(const char *str)

{

     assert(str != NULL);  //断言,保证指针参数不能为空

     const char *pstr = str;   //参数保护

    if (*str == NULL)

         return 0;

    else

         return my_strlen(str + 1) + 1;

}

2.strcat()字符串连接函数

char* my_strcat(char *str1,const char* str2)

{

     assert(str1 != NULL&&str2!=NULL);  

     char *pstr1 = str1;   

     const char* pstr2 = str2;

     while(*pstr1 != '\0')

   {

        pstr1++;

   }

     while (*pstr2!= '\0')

  {

      *pstr1++ = *pstr2++;

   }

  *pstr1 = '\0';

  return str1;

}

3.strcpy()字符串拷贝函数

char* my_strcpy(char *str1,const char* str2)

{

    assert(str1 != NULL&&str2!=NULL);

    char *pstr1 = str1;  

    const char* pstr2 = str2;

    while (*pstr2!= '\0')

   {

       *pstr1++ = *pstr2++;

   }

   *pstr1 = '\0';

   return str1;

}

4.strcmp()字符串比较函数

int my_strcmp(const char *str1,const char* str2)

{

      assert(str1 != NULL&&str2!=NULL);

      const char *pstr1 = str1;  

      const char* pstr2 = str2;

      while (*pstr2!= '\0'&&*pstr2!='\0')

     {

          if (*pstr1 > *pstr2)

               return 1;

          else if (*pstr1 < *pstr2)

               return -1;

              pstr1++;

              pstr2++;

     }

     while (*pstr1 != '\0'&&*pstr2 == '\0')

           return 1;

     while (*pstr1 == '\0'&&*pstr2 != '\0')

           return -1;

return 0;

}

以上函数虽然可以实现字符串的拷贝函数,但是能不能做的更好呢?下面给出另一种实现方法:

int my_strcmp(const char *str1,const char* str2)

{

       assert(str1 != NULL&&str2!=NULL);

       const char *pstr1 = str1;  

       const char* pstr2 = str2;

       int result = 0;

       while (*pstr2!= '\0'||*pstr2!='\0')

      {

            result = *pstr1 - *pstr2;

            if (result != 0)

                  break;

             pstr1++;

             pstr2++;

      }

       if (result>0)

             return 1;

       else if (result<0)

             return -1;

return result;

}