求字符串函数和长度不受限制的字符串函数的详解

简介: 求字符串函数和长度不受限制的字符串函数的详解

前言

作者:小蜗牛向前冲

名言:我可以接收失败,但我不能接收放弃

如果觉的博主的文章还不错的话,还请 点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。

这期博客主要为大家介绍一些字符串函数实现及注意点。

求字符串长度

strlen函数

定义

传参

传字符串过去或者字符串的首地址。

该函数是用来求字符串长度,遇到'\0'就停止计算,返回类型是size_t(unsigned int ),

头文件是<string.h>,下面我们继续介绍是如何使用。

strlen使用举例:

#include<stdio.h>
#include<string.h>
 
int main()
{
  char arr []= "abcdef";
  int ret = strlen(arr);
  printf("ret = %d\n", ret);
  return 0;
}

这里直接传字符串也是可以的。

我们知道了strlen函数的使用,为了让我们更好的理解strlen函数。下面我将用三种方式去模拟实现strlen函数。

1 计数器的方式

//计数器实现
size_t my_strlen(const char* str)
{
  assert(str);//断言字符串不为空字符串
  int count = 0;//记录字符的个数
  while (*str != '\0')
  {
    count++;
    str++;
  }
  return count;
}

2 递归实现

size_t my_strlen_1(const char* str)
{
  assert(str);//断言字符串不为空字符串
  if (*str != '\0')
  {
    return 1 + my_strlen_1(str + 1);
  }
  else
  {
    return 0;
  }
}

3 指针-指针实现

//指针-指针的方式实现
int my_strlen(const char* str)
{
  assert(str);//断言字符串不为空字符串
  char* start = str;//将arr的地址给start 
  char* end = str;//arr地址给end 
  while (*end != '\0') 
  {
    //如果*end不等于'\0' 
    end++;//指针++ 
  }
  return end - start;//指针-指针就是等于长度 
}

我们知道strlen是如何计算字符串的,那该函数的使用有什么要注意的?

注意点:

字符串是以'\0'作为结束的标志,strlen是统计字符串'\0'之前的字符。

参数指向的字符串必须要以 '\0' 结束

字符串的返回类型是size_t类型。

长度不受限制的字符串函数

strcpy字符串拷贝函数

strcat字符串追加函数

strcmp字符串比较函数

strcpy字符串拷贝函数

定义

参数

strcpy( 目标字符串,源字符串);

strcpy是一个字符串拷贝函数,能将源字符串拷贝到目标字符串中,

返回类型是char*(返回的是目标字符串首的地址),

头文件是<string.h>。

strcpy使用举例:

int main()
{
  char arr1[20] = "abcdefg" ;
  char arr2[] = "ping";
  strcpy(arr1, arr2);//拷贝字符串
  printf("%s\n", arr1);
  return 0;
}

这里我们要注意的是strcpy不仅仅把arr2中的字符拷贝过去,还把'\0'拷贝过去了。

模拟实现strcpy

char* my_strcpy(char* dest, const char* source)
{
  assert(dest && source);//断言
  char* ret = dest;//保存好目标字符串的首地址
  while (*dest++ = *source++)
  {
    ;
  }
  return ret;
}

strcpy函数注意点:

源字符串必须以 '\0' 结束。

会将源字符串中的 '\0' 拷贝到目标空间。

目标空间必须足够大,以确保能存放源字符串。

目标空间必须可变。

strcat字符串追加函数

定义

参数

strcat( 目标字符串,源字符串);

strcat是字符串追加函数,能够将源字符串的字符追加到目标字符串中。

返回类型是char*(返回的是目标字符串首的地址),

头文件是<string.h>。

strcat使用举例:

int main()
{
  char arr1[20] = "allow";
  char arr2[] = "act";
    strcat(arr1, arr2);//追加字符串
  printf("%s\n", arr1);
  return 0;
}

strcat模拟实现

char* my_strcat(char* dest, const char* scoure)
{
  assert(dest && scoure);//断言
  char* ret = dest;
  //找到目标字符串的'\0'
  while (*dest!=NULL)//这里不要用(*dest++)这样会导致跳过了'\0'
  {
    dest++;
  }
  //进行字符串的追加
  while (*dest++ = *scoure++)
  {
    ;
  }
  return ret;
}

注意点:strcat函数

源字符串必须以 '\0' 结束。

目标空间必须有足够的大,能容纳下源字符串的内容。

目标空间必须可修改。

不能自己给自己追加字符串,程序会崩溃。

strcmp字符串比较函数

定义

参数

strcmp(string1,string2);

返回值

 

strcmp是字符串比较函数,该函数是从二个字符串的元素开始,进行比较(比较本质为字母ascii码值的大小)。

头文件是<string.h>。

strcmp使用举例:

#define  _CRT_SECURE_NO_WARNINGS
 
#include<stdio.h>
#include<string.h>
\
int main()
{
  char* p1 = "abcdef";
  char* p2 = "afe";
  int ret = strcmp(p1, p2);
  if (ret > 0)
  {
    printf("常量字符串p1大于常量字符串p2\n");
  }
  else if (ret < 0)
  {
    printf("常量字符串p1小于常量字符串p2\n");
  }
  else
  {
    printf("常量字符串p1等于常量字符串p2\n");
  }
  return 0;
}

这里不少人可能会有疑问了,怎么是字符串p1<字符串p2,明明字符串p1有6个字符而字符串p2只有3个字符。

这里我们就要分清楚strcmp函数不是比较字符串中的字符数量,以p1和p2举例,首先比较p1中的a和p2中的a发现二者相等,就继续往下比较,b和f的大小,很明显f是比b大的,所以strcmp就返回一个小于0的数。

我们继续模拟首先strcmp函数加深理解

int my_strcmp(const char* str1, const char* str2)
{
  assert(str1 && str2);//断言
  while (*str1== *str2)
  {
    //判断str1和str2是否相等
    if (*str1 == '\0')//当str1==str2
    {
      return 0;
    }
    str1++;
    str2++;
  }
  //str1与str2不相等,比较大小
  return (*str1 - *str2);
}

strcmp函数

注意点:

理解好strcmp比较方法,便于我们正确的使用strcmp函数。

喜欢的话点个赞在走吧!

 


相关文章
|
开发者
查看edge浏览器插件的安装位置并将插件安装到别的浏览器
查看edge浏览器插件的安装位置并将插件安装到别的浏览器
1457 1
|
SQL 前端开发 关系型数据库
LLM大模型实战 —— DB-GPT阿里云部署指南
DB-GPT 是一个实验性的开源应用,它基于FastChat,并使用vicuna-13b作为基础模型, 模型与数据全部本地化部署, 绝对保障数据的隐私安全。 同时此GPT项目可以直接本地部署连接到私有数据库, 进行私有数据处理, 目前已支持SQL生成、SQL诊断、数据库知识问答、数据处理等一系列的工作。
10632 75
|
Docker 容器
解决docker启动logstash失败的问题(可能原因)
解决docker启动logstash失败的问题(可能原因)
526 0
|
SQL 运维 Java
SpringBoot集成Flyway
Flyway:官方解释:Flyway 将 DevOps 扩展到您的数据库,以加速软件交付并确保代码质量。从版本控制到持续交付,Flyway 以应用程序交付流程为基础,实现数据库部署自动化。 官方解释总是那么拗口和不说人话,当然通过加粗的关键字我们基本也能够了解到Flyway的功能特性。 通俗来说,Flyway可以作为数据库迁移工具服务到我们的应用程序升级发布流程中,减少人为处理sql脚本带来的繁琐和易出错问题。 例如,当我们的一个业务微服务从1.5.0升级到1.5.1的时候涉及到数据库的改动(DDL、DML)可以交给Flyway处理,我们无需关心。
1694 0
|
缓存 负载均衡 算法
【软件设计师备考 专题 】性能指标(响应时间、吞吐量、周转时间)和性能设计
【软件设计师备考 专题 】性能指标(响应时间、吞吐量、周转时间)和性能设计
1103 0
|
Unix Linux Shell
《Linux/UNIX OpenLDAP实战指南》——2.7 OpenLDAP用户以及与用户组相关的配置
添加用户和用户组的方式有两种。一种是将系统用户通过migrationtools工具生成LDIF文件并结合ldapadd命令导入OpenLDAP目录树中,生成OpenLDAP用户。另一种通过自定义LDIF文件并通过OpenLDAP命令进行添加或者修改操作。
4172 0
|
机器学习/深度学习 人工智能 搜索推荐
构建未来:AI在个性化教育中的应用与挑战
【5月更文挑战第30天】 随着人工智能技术的飞速发展,其在教育领域的应用已经从理论走向了实践。个性化教育作为AI技术革新的前沿阵地,正在重塑传统的教学模式和学习体验。本文将探讨AI在个性化教育中的应用、实施过程中所面临的挑战以及未来的发展趋势。我们将分析智能算法如何实现学习内容的个性化推荐,自适应学习路径的设计,以及通过情感计算提升学习者的参与度。同时,我们也将审视数据隐私保护、算法透明度和技术普及等方面的挑战。
|
边缘计算 安全 机器人
2022云栖神秘嘉宾亮相,集IoT智慧与技术于一身
“我们不做机器人,我们提供包括机器人在内的新型智能终端需要的数智能力。”
394 0
2022云栖神秘嘉宾亮相,集IoT智慧与技术于一身
|
资源调度 前端开发 安全
5G 逻辑架构的重构 | 带你读《5G时代的承载网》之十一
5G 的架构设计主要需要满足关键性能需求和网络运营需求,为便于理解 5G 架构设计的革新,本节将以现有 4G 的网络架构为基础,逐一分析现有架 构的局限性,对比 5G 新的性能需求和运营需求,对现有架构进行分解、重构, 逐步靠近 3GPP 确定的 5G 新架构。
5G 逻辑架构的重构   | 带你读《5G时代的承载网》之十一