字符串函数
- unsigned int strlen(const char* str): 字符串长度函数;
 - int strcmp(const char* str1,const char* str2): 字符串比较函数,大于返回正数,小于返回负数,等于返回零;
 - char* strcpy(char* dest, const char* src):字符串复制函数,后者复制到前者中;
 - char* strcat(char* dest, const char* src): 在字符串后面追加另一个字符串,例如,字符串char *dest = “hello ”,char* src = "world";使用strcat(*dest,* src)后, *dest -> “hello world”;
 - char* strstr(const char* str1, const char* str2): 在字符串str1中查找str2,若有,返回该字符串首字符的地址;无则返回NULL
 
字符串长度受限制函数
- char* strncpy( char* str1,const char* str2,unsigned int i): 将str2中的前i个字符复制到str1中。
 - int strncmp(const char* str1, const char* str2, unsigned int i): str1中的前 i 个字符与str2中的前 i 个字符进行比较,返回值与strcmp一样
 - char* strncat(char* dest , const char* src , unsigned int i): 将str2中前 i 个字符追加到str1后面。
 
用字符串函数时需引用 <string,h> 头文件
strlen函数及其实现
strlen函数及其实现
#include <stdio.h>
#include <string.h>
#include <assert.h>//实现断言所需的库函数
//模拟实现
unsigned int my_strlen(const char* str)
{
  assert(*str);//判断是否为空
  int count = 0;//作为计算长度的值
  while(*str++)
  {
    count++;   //当*str不为空时,自加,并且长度count加一
  }            //当*str指向'\0'时,退出循环,并且返回count值
  return count;
}
int main()
{
  char arr[] = "abcdef";
  //int ret = strlen(arr);
  int ret = my_strlen(arr);
  printf("%d\n",ret);
  
  return 0;
}

strcmp函数及其模拟实现
strcmp函数及其模拟实现
#include <stdio.h>
#include <string.h>
#include <assert.h>
int my_strcmp(const char* str1, const char* str2)
{
  assert(*str1 && *str2);//判断*str1 和*str2 是否为空
  while(*str1++ == *str2++)
  {
    ;
  }//若*str1与*str2相等,则继续比较下一个,否则退出循环
  if(*str1 > *str2)
  {
    return 1;
  }
  else if(*str1 < *str2)
  {
    return -1;
  }
  else
  {
    return 0;
  }//当*str1与*str2不相等时,进行比较,*str1 > *str2 返回 1(其他正值也可) 
   //*str1 < *str2 返回-1(其他负值也可),等于时返回 0 ;
}
int main()
{
  char arr1[] = "abcdef";
  char arr2[] = "abcdfg";
  int ret = strcmp(arr1, arr2);
  if(ret > 0)
  {
    printf("arr1 > arr2");
  }
  else if(ret < 0)
  {
    printf("arr1 < arr2");
  }
  else
  {
    printf("arr1 = arr2");
  }
  return 0;
}
strcpy函数及其模拟实现
//strcpy函数及其模拟实现
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcpy(char* dest,const char* src)
{
  assert(*dest && *src);//判断是否为空
  char* p = dest;
  while(*p++ = *src++)
  {
    ;
  }
  *p = *src;//最后将'\0'放入
  return dest;
  
}
int main()
{
  char arr1[] = "zhang";
  char arr2[] = "wang";
  strcpy(arr1, arr2);//将arr2中的字符串复制到arr1中
  char* p = strcpy(arr1, arr2);//可采用第一种,也可以返回指针
  //打印的话可以直接打印arr1数组,
  //如果采用第二种,也可以打印从指针p开始的字符串
  
  //字符串复制模拟实现
  my_strcpy(arr1, arr2);
  
  printf("%s\n", arr1);
  printf("%s\n", p);
  return 0;
}
strcat函数及其模拟实现
//strcat函数及其模拟实现
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcat(char* dest, const char* src)
{
  assert(*dest && *src);
  char* p = dest;
  while(*p)
  {
    *p++;//当p不为空时,指向下一个字符,直到遇见'\0'停止
  }
  while(*src)
  {
    *p++ = *src++;//将字符串arr2中的字符诸葛追加到arr1中
  }
  *p = *src;//将'\0'赋值到最后,作为停止字符
  return dest;
  
}
int main()
{
  char arr1[20] = "hello ";//要开多些空间,防止追加字符时越界访问
  char arr2[] = "world";
  //strcat(arr1, arr2);
  //char* p = strcat(arr1, arr2);
  //同样的,与 strcpy相同,也可以返回指针
  char *p = my_strcat(arr1, arr2);
  printf("%s\n",arr1);
  printf("%s\n",p);
  
  return 0;
}
strstr函数及其模拟实现
//strstr函数及其模拟实现
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strstr(const char* str1, const char* str2)
{
  assert(*str1 && *str2);//判断是否为空
  char* s1 = NULL;
  char* s2 = NULL;
  char* p = str1;
  if (*str2 == '\0')
  {
    return (char*)s1;
  }
  while(*p)
  {
    s1 = p;
    s2 = str2;
    while(*s1 && *s2 && (*s1 == *s2))//当*s1和s2不为空且相等时进入循环
    {
      s1++;
      s2++;
    }
    if(*s2 == '\0')//当比较到*s2为停止字符时,说明查找成功
    {
      return p;//查找成功,返回首字符指针
    }
    p++;//查找没成功,再从下一个字符开始
  }
}
int main()
{
  char arr1[] = "wojiayoumao";
  char arr2[] = "ayo";
  //char* p = strstr(arr1, arr2);
  //在字符数组arr1中查找arr2中的字符串,若存在返回该字符串首字符指针
  //若不存在,返回null
  
  char* p = my_strstr(arr1, arr2);
  printf("%s\n", p);
  
  return 0;
}
strncpy函数及其模拟实现
//strncpy函数及其模拟实现
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strncpy(char* dest, const char* src,unsigned int i )
{
  assert(*dest && *src);
  char* cp = dest;//储存要返回的首字符指针
  while(i)
  {
    *cp++ == *src++;
    i--;
  }
  *cp = '\0';//复制完毕,将停止字符'\0'放到最后
  
  return dest;
  
}
int main()
{
  char arr1[] = "aaaaaa";
  char arr2[] = "bbbb";
  //strncpy(arr1, arr2, 2);
  //char* p = strncpy(arr1, arr2, 2);
  //arr2中前两个字符(bb)复制到arr1中
  
  char* p = my_strncpy(arr1, arr2, 2);
  printf("%s\n", arr1);
  printf("%s\n", p );
  
  return 0;
}
strncmp函数及其模拟实现
//strncmp函数及其模拟实现
#include <stdio.h>
#include <string.h>
#include <assert.h>
int my_strncmp(const char* str1, const char* str2,unsigned int i)
{
  assert(*str1 && *str2);
  while((--i) && (*str1 == *str2))
  {
    *str1++;
    *str2++;
  }
  if(*str1 == *str2)
  {
    return 0;
  }
  else if(*str1 > *str2)
  {
    return 1;
  }
  else
  {
    return -1;
  }
  
}
int main()
{
  char arr1[] = "abcdff";
  char arr2[] = "abcdef";
  //int ret = strncmp(arr1 , arr2, 4);
  //arr1中的前4个字符与arr2中的前4个字符进行比较
  //可知,arr1与arr2全部比较,最后结果是arr1 > arr2
  //但是比较前四个字符的话,arr1 = arr2
  int ret = my_strncmp(arr1, arr2, 4);
  if(ret > 0)
  {
    printf("arr1 > arr2");
  }
  else if(ret < 0)
  {
    printf("arr1 < arr2");
  }
  else
  {
    printf("arr1 = arr2");
  }
  
  return 0;
}
strncat函数及其模拟实现
//strncat函数及其模拟实现
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strncat(char* dest, const char* src,unsigned int i)
{
  assert(*dest && *src);
  char* cp = dest;
  while(*cp)
  {
    *cp++;
  }
  while((i--) && *src)
  {
    *cp++ = *src++;
  }
  *cp = '\0';
  return dest;
}
int main()
{
  char arr1[20] = "hello ";//同样需要定义一个大的数组,防止越界
  char arr2[] = "worldworldworld";
  //char* p = strncat(arr1, arr2, 5);
  //将arr2中的前五个字符追加到arr1后面
  
  char *p = my_strncat(arr1, arr2, 5);
  printf("%s\n", arr1);
  printf("%s\n", p );
  
  return 0;
}










