字符函数和字符串函数详解(一)

简介: 字符函数和字符串函数详解

前言


C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中。

字符串常量适用于那些对它不做修改的字符串函数.


函数介绍及模拟


strlen函数

size_t strlen ( const char * str );


1.字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中’\0’ 前面出现的字符个数(不包含 ‘\0’ )。

2.参数指向的字符串必须要以 ‘\0’ 结束。

3.注意函数的返回值为size_t,是无符号的整数。


例:


#include <stdio.h>
#include<string.h>
int main()
{
  const char*str1 = "abcdef";    //常量字符串后面默认带了个'\0'
  const char*str2 = "bbb";
  if(strlen(str2)-strlen(str1)>0)      // 6-3
  {
  printf("str2>str1\n");
  }
  else
  {
  printf("srt1>str2\n");
  }
  return 0;
}


模拟实现

size_t strlen ( const char * str );


#include<stdio.h>
size_t my_strlen(const char* str)
{
  const char* start = str;
  const char* end = str;
  while (*end != '\0')
  {
  end++;
  }
  return end - start;     //指针相减等于两指针间的元素个数
}
int main()
{
  char arr[] = "abcdef";
  int len = my_strlen(arr);
  printf("%d\n", len);
  return 0;
}


strcpy函数


char* strcpy(char * destination, const char * source );


注:前面的指针指向目标字符串,后面指针指向源字符串


1.源字符串必须以 ‘\0’ 结束。

2.将源指向的字符串复制到目标所指向的数组中,包括 ‘\0’ 字符(并在该点停止)。

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

4.目标空间必须可变。(常量字符串不能修改,目标空间不能是常量字符串)


#include<stdio.h>
#include<string.h>
int main()
{
  char arr[20] = "abcdef";
  char* m = "fff";
  strcpy(arr, m);
  printf("%s", arr);    
  return 0;
}

输出:fff


模拟实现

char* strcpy(char * destination, const char * source );


函数返回值为目标字符串起始地址


char* my_strcpy(char* dest, const char* src)
{
  char* ret = dest;
  while (*dest++ = *src++);  //后置加加,先解引用,再赋值,再加加,直到*dest=*src='\0',退出循环
  return ret;
}
int main()
{
  char arr1[20] = "abc";
  char arr2[] =   "hello hello";
  printf("%s\n", my_strcpy(arr1, arr2));
  return 0;
}

输出:hello hello


strncpy函数


char * strncpy ( char * destination, const char * source, size_t num );


1.拷贝num个字符从源字符串到目标空间。

2.如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。

8c76aa33d6c140a89c2e45c5fa028c3f.png


我们可以看到,在拷贝完源字符串后又追加了3个0

模拟实现:


char* m_strncpy(char* destination, const char* source, size_t num)
{
  char* p = destination;
  int i = 1;
  while (*destination = *source)
  {
  destination++;
  source++;
  i++;
  }
  destination++;
  num -= i;
  while (num--)
  {
  *destination++ = '\0';
  }
  return p;
}
int main()
{
  char arr[20] = "abcdef";
  char* m = "abc";
  printf("%s", strncpy(arr, m, 6));
  return 0;
}


strcat函数


char * strcat ( char * destination, const char * source );


1.将源字符串的内容追加到目标字符串(包括 ‘\0’ ),目标中的 ‘\0’ 字符被源的第一个字符覆盖。

2.源字符串必须以 ‘\0’ 结束。

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

4.目标空间必须可修改。


例:


#include<stdio.h>
#include<string.h>
int main()
{
  char arr[20] = "abcdef";
  char* m = "abc";
  printf("%s", strcat(arr, m));     //函数返回值为目标字符串起始地址
  return 0;
}


输出:abcdefabc


模拟实现

char * strcat ( char * destination, const char * source );


#include<stdio.h>
char* m_strcat(char* destination, const char* source)
{
  char* p = destination;
  while (*destination++);     
  destination--;            //destination指向了\0后面的元素,所以--
  while (*destination++ = *source++);
  return p;
}
int main()
{
  char arr[20] = "abcdef";
  char* m = "abc";
  printf("%s", m_strcat(arr, m));     
  return 0;
}


strncat函数


char * strncat ( char * destination, const char * source, size_t num );


1.将源的前 num 个字符追加到目标,外加一个终止空字符。

2.如果源中 C 字符串的长度小于 num,则仅复制到终止空字符之前的内容。


类似于前面的 strncpy 这里就不展开讲了。


相关文章
|
存储 监控 安全
【深入探究C++日志库写入策略】glog、log4cplus与spdlog的写入策略比较
【深入探究C++日志库写入策略】glog、log4cplus与spdlog的写入策略比较
858 0
|
Windows
[✔️]exe引入ffmpeg后,在win7上应用程序无法正常启动(0xc0000005)
[✔️]exe引入ffmpeg后,在win7上应用程序无法正常启动(0xc0000005)
1778 0
|
7月前
|
人工智能 API 语音技术
HarmonyOS Next~鸿蒙AI功能开发:Core Speech Kit与Core Vision Kit的技术解析与实践
本文深入解析鸿蒙操作系统(HarmonyOS)中的Core Speech Kit与Core Vision Kit,探讨其在AI功能开发中的核心能力与实践方法。Core Speech Kit聚焦语音交互,提供语音识别、合成等功能,支持多场景应用;Core Vision Kit专注视觉处理,涵盖人脸检测、OCR等技术。文章还分析了两者的协同应用及生态发展趋势,展望未来AI技术与鸿蒙系统结合带来的智能交互新阶段。
389 31
|
12月前
|
传感器 机器学习/深度学习 人工智能
仿生机器人:自然界灵感的工程应用
【10月更文挑战第14天】仿生机器人作为自然界灵感与工程技术的完美结合,正逐步改变着我们的生活和工作方式。通过深入了解其设计原理、关键技术、应用领域以及未来的发展趋势,我们可以更加清晰地看到仿生机器人在推动科技创新和社会发展中的重要作用。让我们共同期待仿生机器人在未来带来的更多惊喜和变革!
|
12月前
|
弹性计算 网络协议 网络安全
内网DNS解析&VPN网关联动实现云上访问云下资源
内网DNS解析&VPN网关联动实现云上访问云下资源
|
Java Maven
SpringMVC常用Maven POM.xml依赖包片段
SpringMVC常用Maven POM.xml依赖包片段
|
人工智能 自然语言处理 搜索推荐
博物馆地图导览系统:GIS与蓝牙定位技术实现地图导览与语音解说功能
维小帮博物馆地图导览系统结合GIS地图、蓝牙定位及智能语音解说,为访客提供沉浸式导览。系统采用自研地图引擎,精准构建三维模型,支持路径规划与个性化定制。蓝牙技术实现高精度室内定位及自动触发语音解说功能,无需手动操作。系统还支持多语言解说与AI语音生成,提升参观体验。目前已在多个博物馆应用并获好评。期待与您共同推进文化科技的融合发展!
376 3
|
前端开发 JavaScript 机器人
从零开始构建一个聊天机器人
【8月更文挑战第7天】构建聊天机器人是一个涉及多个步骤和技术的复杂过程。从前期准备到实际部署,每一步都需要仔细规划和执行。通过不断学习和实践,你可以逐步掌握构建聊天机器人的技巧和方法,为企业创造更大的价值。
|
消息中间件 Java Kafka
spring kafka的问题集锦
spring kafka的问题集锦
668 0
|
机器学习/深度学习 算法 数据可视化
Python中的聚类分析以及如何使用Sklearn库进行聚类。
【4月更文挑战第20天】在Python的Scikit-learn库中进行聚类分析,包括安装库、导入模块、准备数据、选择算法(如K-means)、创建并训练模型、预测聚类、评估结果及可视化。
478 0