学C的第二十八天【字符串函数和内存函数的介绍(一)】-3

简介: 方法3:迭代方式

方法3:迭代方式


对应代码:

#include <stdio.h>
//方法3:迭代方式
size_t my_strlen(const char* str)
//和库函数的strlen函数一样
//返回值为无符号整型,参数为常量字符指针
{
  if (*str == '\0')
  {
    return 0;//如果第一个就指向\0,说明长度是0
  }
  else
  {
    return 1 + my_strlen(str + 1);
  }
}
int main()
{
  size_t sz = my_strlen("abc");
  //使用模拟实现的strlen函数返回一个size_t(无符号整数)的数
  //进行打印:
  printf("%u\n", sz);
  //%u:打印无符号的数
  return 0;
}

(2). 模拟实现strcpy()函数:

主函数:

189a0cefb1f54c52922cc4ac44f6fdcb.png

模拟实现strcpy()函数:

image.png

对应代码:

//模拟strcpy函数:
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* src)
//返回值类型 和 参数 与库函数strcpy相同
//返回值设置为char*,是为了能够使用链式访问,把返回值作为其它函数的参数
{
  //保存目标空间指针原位置,方便最后进行返回
  char* ret = dest;
  //进行断言,两个指针都不为空指针,需要头文件<assert.h>
  assert(dest != NULL);
  assert(src != NULL);
  //只要 源字符串 还没指向 \0 就继续循环拷贝
  while (*src != '\0')
  {
    *dest = *src; //将源字符串的一位赋给目标空间
    //下次赋值下一位,所以要移动两个指针:
    dest++;
    src++;
  }
  //循环中没有将 \0 赋给目标空间,所以要加上:
  *dest = *src;
  //循环完后,dest移向了新位置,src在\0位置,所以直接赋值即可
  //返回拷贝后的目标指针原地址:
  return ret;
}
int main()
{
  //目标空间(字符数组):
  char arr1[20] = "xxxxxxxxxxxxxxxx";
  //源字符串:
  char arr2[] = "hello world";
  my_strcpy(arr1, arr2); //使用模拟的函数来拷贝
  //arr1为目标空间指针,arr2为源字符串指针
  //将arr2指向的内容 拷贝到 目标空间指针中
  //打印拷贝结果:
  printf("%s\n", arr1);
  return 0;
}

可进行化简:

image.png

对应代码:

//模拟strcpy函数:
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* src)
//返回值类型 和 参数 与库函数strcpy相同
//返回值设置为char*,是为了能够使用链式访问,把返回值作为其它函数的参数
{
  //保存目标空间指针原位置,方便最后进行返回
  char* ret = dest;
  //进行断言,两个指针都不为空指针,需要头文件<assert.h>
  assert(dest != NULL);
  assert(src != NULL);
  //只要 源字符串 还没指向 \0 就继续循环拷贝
  while (*dest++ = *src++)
  {
    ;
  }
  //返回拷贝后的目标指针原地址:
  return ret;
}
int main()
{
  //目标空间(字符数组):
  char arr1[20] = "xxxxxxxxxxxxxxxx";
  //源字符串:
  char arr2[] = "hello world";
  my_strcpy(arr1, arr2); //使用模拟的函数来拷贝
  //arr1为目标空间指针,arr2为源字符串指针
  //将arr2指向的内容 拷贝到 目标空间指针中
  //打印拷贝结果:
  printf("%s\n", arr1);
  return 0;
}

(3). 模拟实现strcat()函数:

image.png

对应代码:

//模拟strcat函数:
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcat(char* dest, const char* src)
{
  //进行断言,两个字符串都不为\0 (空)
  assert(dest);
  assert(src);
  //保存目标地址的原位置
  char* ret = dest;
  //找到目标字符串的\0,作为连接的起点:
  while (*dest)
  {
    dest++;
  }
  //开始连接字符串,和strcpy是一样的
  while (*dest++ = *src++)
  {
    ;
  }
  //返回连接后的目标空间指针:
  return ret;
}
int main()
{
  //目标空间(数组):
  char arr1[20] = "hello";
  //源字符串:
  char arr2[] = " world";
  //使用模拟的自定义函数,将arr2连接到arr1后
  my_strcat(arr1, arr2);
  //打印连接后的新字符串:
  printf("%s\n", arr1);
  return 0;
}

(4). 模拟实现strcmp()函数:

7e921d29b5694c7bb49ecb3e6b2cf6a4.png

对应代码:

//模拟strcmp函数:
#include <stdio.h>
int my_strcmp(const char* str1, const char* str2)
{
  while (*str1 == *str2)
    //两字符串同位置上的值相同的情况
  {
    if (*str1 == '\0')
      //同位置上都是\0说明两个字符串相同
    {
      return 0; //相同则返回 0
    }
    //不是\0,是其它值相同,则判断下一位
    str1++;
    str2++;
  }
  if (*str1 > *str2)
    //当前位置,字符串1的字符大于字符串的字符
  {
    return 1; //大于则返回大于0的数
  }
  else
    //当前位置,字符串1的字符小于字符串的字符
  {
    return -1; //小于则返回小于0的数
  }
}
int main()
{
  //使用自定义函数进行比较:
  int ret = my_strcmp("abq", "abc");
  printf("%d\n", ret);
  return 0;
}


(5). 模拟实现strstr()函数:

模拟的自定义函数:

image.png

主函数:

image.png

对应代码:

//模拟strncmp函数:
#include <stdio.h>
#include <string.h>
char* my_strstr(char* str1, char* str2)
{
  char* cp = str1; //开始进行判断的初始位置指针
  char* s1 = cp; //在arr1中的cp位置开始逐位进行匹配的指针
  char* s2 = str2; //在arr2中逐位进行匹配的指针
  //如果要找的子字符串为空指针,则返回str1:
  if (*str2 == '\0')
  {
    return str1;
  }
  while (*cp != '\0')
    // \0之后不可能找到arr2的内容
  {
    //开始匹配:
    s1 = cp; //让s1在初始位置开始进行逐位判断
    s2 = str2;
    while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
      //两字符串都未到\0,如果当前位置的内容相同,则再循环判断下一位
    {
      s1++;
      s2++;
    }
    if (*s2 == '\0')
      //如果子字符串已经到了\0,
      //说明arr1中有arr2,匹配成功
    {
      return cp; 
      //匹配成功,则返回子字符串的初始位置
    }
    cp++; //判断arr1下一个初始位置
  }
  return NULL; //未找到则返回空指针
}
int main()
{
  char arr1[] = "abbbcdef";
  char arr2[] = "bbc";
  //使用自定义函数进行查找:
  char* ret = my_strstr(arr1, arr2);
  if (ret != NULL)
  {
    printf("%s\n", ret);
  }
  else
  {
    printf("未找到");
  }
  return 0;
}


相关文章
|
24天前
10分钟让你学会内存函数:memcpy,memmove,memset,memcmp的用法及模拟实现。
10分钟让你学会内存函数:memcpy,memmove,memset,memcmp的用法及模拟实现。
16 2
|
21天前
|
C语言
【C语言】:动态内存管理函数malloc,calloc,realloc和free的介绍的介绍
【C语言】:动态内存管理函数malloc,calloc,realloc和free的介绍的介绍
24 0
|
24天前
|
C语言
字符串和内存函数(1)
字符串和内存函数(1)
28 7
|
21天前
|
C语言
【C语言】:4大内存函数
【C语言】:4大内存函数
15 2
|
24天前
字符串和内存函数(2)
字符串和内存函数(2)
25 5
|
1月前
|
安全 C语言
【C语言基础】:内存操作函数
【C语言基础】:内存操作函数
|
17天前
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
19 0
|
17天前
|
程序员 C语言
C语言内存管理:malloc、calloc、realloc与free函数详解
C语言内存管理:malloc、calloc、realloc与free函数详解
13 0
|
21天前
|
C语言
C语言内存函数
C语言内存函数
9 0
|
24天前
|
C语言 C++
C语言----C语言内存函数
C语言----C语言内存函数
14 0