【字符操作函数】


 1.strstr()函数用来检索子串在字符串中首次出现的位置,其原型为:
    char *strstr( const char *dest,const  char * src );

【参数说明】dest为要检索的字符串,src为要检索的子串。

【返回值】返回字符串str中第一次出现子串src的地址;如果没有检索到子串,则返回NULL


【函数实现】

#include <stdio.h>

char* my_strstr(const char *dest,const char *str)
{
     char *ptr=(char *)dest;
     char *p1=NULL;
     char *p2=NULL;
     while (*ptr)
     {
         p1=ptr;
         p2=(char *)str;
         while (*p1==*p2)
        {
             p1++;
             p2++;
             if (*p2=='\0')
            {
                 return ptr;
            }
        }
        ptr++;
     }
     return NULL;
}

结果:

wKiom1ZeeL-yYkAyAAAOOUfndEo897.png

2.strcat()函数用来连接字符串,其原型为:

    char *strcat(char *dest ,const char *src)


【参数】dest 为目的字符串指针,src 为源字符串指针。


        strcat() 会将参数 src 字符串复制到参数 dest 所指的字符串尾部;dest 最后的结束字符 NULL 会被覆盖掉,并在连接后的字符串的尾部再增加一个 NULL。

注意:dest 与 src 所指的内存空间不能重叠,且 dest 要有足够的空间来容纳要复制的字符串。

【返回值】返回dest 字符串起始地址。

【函数实现】

#include <stdio.h>
#include <assert.h>
#define MAXLINE 100

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

int main()
{
     char arr[MAXLINE]="abcd";
     char *p="efgh";
     char *ret=my_strcat(arr,p);
     printf("%s\n",ret);
     return 0;
}


结果:

wKioL1Zef9vjVIB6AAAPbgpW1AM860.png


3.strcmp()函数用来比较字符串大小,其原型为:

    

int strcmp( const char *dest, const char *src)

【参数】dest,src为需要比较的两个字符串。

字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。strcmp()首先将dest 第一个字符值减去src 第一个字符值,若差值为0 则再继续比较下个字符,若差值不为0 则将差值返回。例如字符串"Ac"和"ba"比较则会返回字符"A"(65)和'b'(98)的差值(-33)。

【返回值】若参数dest 和src 字符串相同则返回0。dest  若大于src从则返回大于0 的值。dest  若小于src则返回小于0 的值。

注意:strcmp() 以二进制的方式进行比较

【函数实现】

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

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 *str1="abcde";
     char *str2="abcfe";
     int ret = my_strcmp(str1,str2);
     if (ret > 0)
     {
          printf("str1 > str2\n");
     }
     else if(ret < 0)
     {
          printf("str1 < str2\n");
     }
     else
          printf("str1 =str2\n");
     return 0;
}

结果:

wKiom1ZeoR2ifBUpAAAQErzOS7E669.png

4.strlen()函数用来计算字符串长度,其原型为:

size_t strlen( const char *string );    

【参数说明】string为指定的字符串。

strlen()用来计算指定的字符串string 的长度,不包括结束字符"\0"。

【返回值】返回字符串string 的字符数。


【注意】 strlen() 函数计算的是字符串的实际长度,遇到第一个'\0'结束。如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到'\0'停止。而sizeof返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen()是函数。

【函数实现】

/*
*计数器方法实现
*/
#include <stdio.h>
#include <assert.h>

int my_strlen(const char *str)
{
     int count=0;
     assert(str);//断言
     while (*str)
     {
            count++;
            str++;
     }
     return count;
}

int main()
{
      char arr[]="abcde";
      int ret=my_strlen(arr);
      printf("%d\n",ret);
      return 0;
}

/*
**递归方法实现
*/
#include <stdio.h>
#include <assert.h>

int my_strlen(const char *str)
{
      assert(str);
      if (*str=='\0')
      {
            return 0;
      }
      else
      {
            return (1+my_strlen(str+1));
      }
}

int main()
{
      char arr[] = "abcde";
      int ret = my_strlen(arr);
      printf("%d\n",ret);
      return 0;
}

/*
**指针方式实现
*/
#include <stdio.h>

int my_strlen(const char *str)
{
 
      const char *p=str;
      while (*str)
      {
            str++;
      }
      return str-p;
}

int main()
{
      char arr[]="abcde";
      int ret=my_strlen(arr);
      printf("%d\n",ret);
      return 0;
}

结果:

wKioL1ZepDqDUh_rAAAPd59G4Jo548.png

5.strcpy()函数,函数原型

    char *strcpy(char *dest, const char *src);

【函数说明】:strcpy()会将参数src 字符串拷贝至参数dest 所指的地址。

【返回值】:返回参数dest 的字符串起始地址。


【函数实现】

#include <stdio.h>
#include <assert.h>
#define MAX 20

void my_strcpy(char *dest,char *str)
{
     assert(dest);
     assert(str);
     while (*dest++=*str++);
}
int main()
{
     char arr[MAX]={0};
     char *ps="abcde";
     my_strcpy(arr,ps);
     printf("%s\n",arr);
     return 0;
}

结果:

wKiom1ZepRbg3eLaAAAQbljlWb4924.png


注意:为什么结果是abcde呢?后面的0怎么没有打印出来,因为字符串是以‘\0’作为结束标志的,而‘\0’的对应的ASCII码值正好是0,所以就自然而然的结果是abcde了!