[字符串和内存函数]strcpy和strlen字符串函数的详解和模拟

简介: [字符串和内存函数]strcpy和strlen字符串函数的详解和模拟


strcpy

介绍库函数strcpy

这个库函数核心目的就是复制字符串

我们可以登陆https://cplusplus.com/reference/cstring/strcpy/看详细的官方讲解。

例子

分析模拟实现思路

strcpy函数用于将源字符串的内容复制到目标字符串中。该函数的原型为char* strcpy(char* dest, const char* src)。其中dest是目标字符串的指针,src是源字符串的指针。函数将会复制src指向的字符串内容到dest指向的字符串中,并返回dest指针。

在模拟中,我们定义了一个叫做my_strcpy的函数,实现了类似strcpy的功能。函数的参数是一个指向目标字符串和源字符串的指针。在函数体内部,我们使用了一个while循环来逐个复制源字符串中的字符到目标字符串中。最后,函数返回了目标字符串的指针。

在main函数中,我们定义了两个字符数组arr1和arr2。通过调用my_strcpy函数,将arr2中的字符串复制到arr1中,并使用printf函数打印出复制后的字符串。

这个例子使用了assert宏来进行参数的合法性校验,并使用了const关键字来修饰源字符串的指针,以表示在函数内部不会改变源字符串的内容。

总结起来,模拟实现库函数strcpy的代码通过逐个复制字符的方式实现了字符串的复制功能,并使用了assert和const来增加代码的可靠性和安全性。

补充

assert宏

assert宏是一种用于进行参数的合法性校验的工具。它在C/C++中使用,可以简化代码中的参数校验过程。通过assert宏,我们可以在代码中插入断言语句,确保某个条件为真。如果条件不满足,assert会触发一个断言错误,并终止程序的执行。这可以帮助我们及早发现和修复代码中的错误。

在进行参数的合法性校验时,我们可以使用assert宏来断言参数的特定条件,例如判断参数是否为null、是否满足特定的范围或条件等。通过assert宏的使用,我们可以在代码中明确表示参数的合法性要求,并在出现问题时及早发现并处理。

需要注意的是,assert宏只在调试时生效,当代码被编译为发布版本时,默认会禁用assert宏的功能,以提高执行效率。因此,在生产环境中,我们应该谨慎使用assert宏,并确保在发布版本中不会出现断言错误。

总之,assert宏是一种用于进行参数的合法性校验的工具,可以帮助我们在代码中插入断言语句,确保参数满足特定的条件。它是一个常用的调试工具,可以帮助我们及早发现和修复代码中的错误。

const关键字来修饰源字符串的指针

const关键字可以用来修饰源字符串的指针,表示该指针指向的字符串是常量,不可以修改。这样可以保证源字符串的内容不被意外修改。

情况一:const 在*的左边:const int p 与 int const * p 一样

const放在* 的左边,const修饰的是指针指向的内容,表示指针指向的内容,不能通过指针来改变了; 但是指针变量本身可以修改

int num = 0;
int n = 1000;
const int* p = #
 *p = 20;//err
 p = &n;//ok

情况二:const 在*的右边:int * const p

const放在*的右边,const修饰的指针变量本身,表示指针变量本身的内容不能被修改,但是指针指向的内容,可以通过指针来改变。

int* const p = #
*p = 20;//ok
 p = &n;//err

代码展示

#include<assert.h>
#include<stdio.h>
//#include<string.h>
char* my_strcpy(char* dest, const char* src)
{
  assert(dest && src);
  char* ret = dest;
  while (*dest++ = *src++)
  {
    ;
  }
  return ret;
}
int main()
{
  char arr1[20] = "*************";
  char arr2[] = "hello";
  printf("%s\n", my_strcpy(arr1, arr2));  //链式访问
  return 0;
}

strlen

介绍库函数strcpy

这个库函数核心目的就是求字符串长度

strlen函数是用于计算字符串的长度的函数。它是通过Zend Engine定义的,并且在函数的源码中可以找到其具体实现。

这个函数接受一个字符串作为参数,返回这个字符串的长度,即字符串中字符的个数。

在对字符串进行操作时,了解字符串的特点是非常重要的,其中最重要的特点就是字符串以’\0’结尾。 通过使用strlen函数,我们可以轻松地获取字符串的长度,以便于进行其他相关的操作。

我们可以登陆https://cplusplus.com/reference/cstring/strlen/看详细的官方讲解。

例子

分析模拟实现思路

计数器

使用计数器的方式,通过遍历字符串,每遍历一个字符计数器加1,直到遇到字符串结束符’\0’为止。

递归

递归函数首先判断当前字符是否为字符串结束符’\0’,如果是,则返回0;否则,递归调用自身并返回结果加1。

指针-指针

使用指针-指针的方式。通过指针p指向字符串的首地址,然后不断向后移动指针p,直到指针p指向字符串结束符’\0’,最后返回指针p与字符串首地址的差值,即字符串的长度。

代码展示

计数器

int my_strlen1(const char* str) {
    int count = 0;
    while (*str != '\0') {
        count++;
        str++;
    }
    return count;
}

递归

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

指针-指针

int my_strlen2(const char* str) {
    if (*str == '\0')
        return 0;
    else
        return 1 + my_strlen2(str + 1);
}
相关文章
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
33 3
|
8天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
29 6
|
27天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
22天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
19 0
|
1月前
|
C语言 C++
c语言回顾-内存操作函数
c语言回顾-内存操作函数
39 0
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
366 0
|
21天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
43 1
|
26天前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
30天前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
1月前
|
存储 编译器
数据在内存中的存储
数据在内存中的存储
41 4