字符+字符串函数 二

简介: 字符+字符串函数

strtok


1.del参数是字符串,定义了用作分隔符的字符集合
2.第一个参数指定一个字符串,它包含0个或者多个由del字符集合
中一个或者多个分隔符的标记
3.strtok函数找到str中的第一个标记,并将其用'\0'结尾,
返回一个指向这个标记的指针(strtok函数会改变被操作的字符串,
在使用strtok函数切分的字符串一般都是临时拷贝的内容
4.strtok函数的一个参数不为NULL,函数将找到str中第一个标记,strtok
函数将保存它在字符串中的位置
5.strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置
开始,查找下一个标记
6.如果字符串中不存在更多的标记,则返回NULL指针

strtok函数的使用

#include<stdio.h>
#include<string.h>
int main()
{
  const char* del = "@.";
  char arr[] = "2841460969@qq.com";
  char ch[20] = { 0 };
  strcpy(ch, arr);
  char* ret = NULL;
  for (ret = strtok(ch, del); ret != NULL; ret = strtok(NULL, del))
  {
    printf("%s\n", ret);
  }
  return 0;
}

ed8da9d74264956d359badb0d5df6782_3064b4a47c0041e687470e31e82fa0c5.png


错误信息报告


strerror


返回错误码所对应的错误信息


C语言的库函数,在执行失败时都会设置相应的错误码

例如

#include<stdio.h>
#include<string.h>
int main()
{
  printf("%s\n", strerror(0));
  printf("%s\n", strerror(1));
  printf("%s\n", strerror(2));
  printf("%s\n", strerror(3));
  return 0;
}


17a676c466b500a8422ec80b180e0bdf_de900b676b844431acb7500698250958.png

实例

errno是C语言设置的全局的错误码存放的变量

#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
  FILE* p = fopen("test.c", "r");
  if (p == NULL)
  {
    printf("%s\n", strerror(errno));
  }
  return 0;
}

e5d0bb51fa6d62f2d92342df64a8471c_a959a10bd7324a91a0e4607a4d0dab0d.png

由运行结果可知,文件test.c存在


内存操作函数


memcpy-内存拷贝



1.函数memcpy从source的位置开始向后复制num个字节的数据到destination
的内存位置
2.函数在遇到'\0'时并不会停下来
3.如果source和destination有任何的重叠,复制的结果都是未知的

模拟实现memcpy

#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, const void* src, int num)
{
  assert(dest && src);
  void* ret = dest;
  while (num--)
  {
    *(char*)dest = *(char*)src;
    dest = (char*)dest + 1;
    src = (char*)src + 1;
  }
  return ret;
}
int main()
{
  int arr1[] = { 1,2,3,4,5,6,7,8,9 };
  int arr2[10] = { 0 };
  my_memcpy(arr2, arr1, 20);
  return 0;
}


b702563f09cd8be396d1c2ce98a15d21_76e1d09705974207ad60fff8f3d8783c.png


memmove-可处理重叠的内存拷贝


1.与memcpy的差别是memmove函数处理的源内存块和目标内存块是可以重叠的
2.如果源空间和目标空间出现重叠,需要使用memmove函数进行处理


模拟实现memmove函数

当dest<src时,情况1 需要从前往后拷贝数据
当src<dest<src+size_num 情况2 从后往前或者从前往后均可拷贝
当src+size_num<dest 情况3 需要从后往前拷贝数据
#include<stdio.h>
#include<assert.h>
void* my_memmove(void* dest, const void* src, int num)
{
  assert(dest && src);
  void* ret = dest;
  //从前往后拷贝
  if (dest < src)
  {
    while (num--)
    {
      *(char*)dest = *(char*)src;
      dest = (char*)dest + 1;
      src = (char*)src + 1;
    }
    return ret;
  }
  //从后往前拷贝
  else
  {
    while (num--)
    {
      *((char*)dest + num) = *((char*)src + num);
    }
  }
}
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  my_memmove(arr + 2, arr, 20);
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}

25a85c8968b5698c0ad7009056f3de3d_f672d271e5ad4c55860d964c7897553a.png


memcmp-内存数据比较


1.比较从ptr1和ptr2只在开始的第num个字节
2.若ptr1指向的字节内容比ptr2指向的字节内容小,返回小于0的变量
若ptr1指向的字节内容和ptr2指向的字节内容相等,则继续向后比较
若ptr1指向的字节内容比ptr2指向的字节内容大,返回大于0的变量

目录
相关文章
|
存储 算法 前端开发
Java——使用Map还是实体类?
Java——使用Map还是实体类?
|
测试技术 C语言
wrk(2)- Lua 脚本的使用
wrk(2)- Lua 脚本的使用
1087 0
wrk(2)- Lua 脚本的使用
|
4月前
|
人工智能 缓存 Kubernetes
ACK GIE配置建议
Gateway with Inference Extension是基于Kubernetes社区Gateway API及其扩展规范实现的增强型组件,支持四层/七层路由服务,并面向生成式AI推理场景提供负载均衡优化、服务管理简化等能力,适用于AI推理服务的高可用部署与性能优化。在不同的场景使用ACK Gateway with Inference Extension时,可能需要根据业务需求和高可用需要对网关和推理扩展进行不同的配置调整。本文主要介绍在实际业务场景中针对ACK GIE的配置建议,以获得更好的使用效果。
282 23
|
人工智能 搜索推荐 机器人
[AI Mem0] 概览,智能自我改进记忆层
[AI Mem0] 概览,智能自我改进记忆层
|
机器学习/深度学习 测试技术 网络架构
YOLOv8改进 | 主干篇 | ConvNeXtV2全卷积掩码自编码器网络
YOLOv8改进 | 主干篇 | ConvNeXtV2全卷积掩码自编码器网络
619 1
YOLOv8改进 | 主干篇 | ConvNeXtV2全卷积掩码自编码器网络
|
JavaScript 前端开发 Java
【程序员小白入门】这几个宝藏菜鸟教程网站记得收藏!!!
其实菜鸟教程相关的网站内容都大同小异,推荐这几个原因是页面交互比较简单,重要的是没有任何广告。
|
弹性计算 负载均衡 Kubernetes
你所不了解的 Traefik
在之前的文章中,我们简单介绍了关于 Traefik 的相关概念及组件原理机制,具体可参考:为什么选择 Traefik Ingress ?
530 0
Linux--shell中获取字符串长度的常用方法
Linux--shell中获取字符串长度的常用方法
|
JavaScript
[✔️]cmake command 无法使用通配符匹配文件,只能检索下目录指定文件
[✔️]cmake command 无法使用通配符匹配文件,只能检索下目录指定文件
412 0