c语言学习第二十七课 ——一些内存函数与字符串函数

简介: c语言学习第二十七课 ——一些内存函数与字符串函数

strtok函数

592270ddb2704d8f8f43078def706205.png

char* strtok(char *str,char *sep)

返回的是分割符标记的起始位置

函数作用   给一个邮箱  kajsoijfdcoaioij@.com           @ 。被叫做分割符

该函数作用就是提取这些分割符。

第一的参数为字符串,sep参数是个字符串,定义了用做分割符字符的集合

53c130267e4c43a9ad9f1c35454ba4bb.png  例如

int main()
{
  char arr[] = " kajsoijfdcoaioij@.com ";
  const char* p = "@.";
  char bufer[30] = { 0 };
  char* str = strtok(bufer, p);
  strcpy(bufer, arr);
  //该函数会改变字符串中的分隔符为\0;
  strtok(bufer, p);
  //strtok传的第一个参数不为空指针时,读入,当遇到分割符时,变为\0,切割掉返回空指针,保c存分割符的位置,继续进行切割,寻找下一个分割符
  //常量i昂字符无法修改
  strtok(NULL, p);
  printf("%s\n", str);
  strtok(NULL, p);
  printf("%s\n", str);
  strtok(NULL, p);
  printf("%s\n", str);
  //
  char* str = NULL;
  for (str = strtok(bufer, p); str= NULL;str = strtok(NULL,p))
  {
    printf("%s\n", str);
  }
  return 0;
}

strerror函数

a7889810197540ebacdfe5a738be95e3.png

e9431c8cfe014b22b6b1e69a737ca884.png

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

char *strerror()

每一个错误码都有错误信息

c语言的库函数再调用失败的时候,会将一个错误码存放在一个叫error的变量中,当我们想知道调用库函数的时候发生了什莫错误,就可以把error里的错误码翻译为错误信息。 例

int main()
{
  char* p = strerror(0);
  printf("%s\n", p);
  char* p = strerror(1);
  printf("%s\n", p);
  char* p = strerror(2);
  printf("%s\n", p);
  char* p = strerror(3);
  printf("%s\n", p);
  return 0;
}

举例打印文件打开错误

int main()
{
  //打开文件
  FILE* p = fopen("text.txt", "r");//如果打开方式是“r”,若文件存在则打开成功,否则失败
  //这里未建立这样的文件
  if (p == NULL)
  {
    printf("打开失败,原因是%s\n",strerror(errno));//显示错误 errno中把错误码翻译成错误信息
    //perror函数  打印错误信息
    //perror("文件打开失败");把定义的错误信息后在打印错误信息,可以理解为printf+strerror结合函数。
  }
  //读写文件
  //关闭文件
  fclose(p);
  p = NULL;
  return 0;
}

这里还有许多常用的字符判断函数。其用法相似。

8abb01dd77c54e6d9777bfcbd7efd52a.png

df98fa0a714c4129accb92367c436ed2.png

isdigit

55cdf4f87d204a63920e9f76359ceea2.png

7abc8d39d13a4dbe8adab6fbba040be7.png

isspace     isxdigit   islower  issupper    isalpha   isaipha等的函数.

内存函数

不同于字符串函数,这里可以实现各种类型的数据的函数。

memcpy

3c22bd78b7b04080b9ab274467a1e733.png

fa4b2f4ee6864cc6a5bcdefdf7ca0c19.png

例如

int main()
{
  int arr1[] = { 1,2,3,4,5,6,7,8,9 };
  int arr2[] = { 0 };
  //memcpy,拷贝数据
  memcpy(arr2, arr1, 20);//把arr1中的5个整形拷贝到arr2中 , size_t num为所拷贝数据内存大小,
    float arr1[] = { 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0 };
  float arr2[] = {0.0};
  memcpy(arr2, arr1, 12);//把arr1中的5个整形拷贝到arr2中 
  return 0;
}

函数实现

void* my_memcpy(const void*str,const void *ptr,size_t num)
{
  void* ret = str;
  assert(str && ptr);//断言判断是否为指针
  while (num--)
  {
       *(char*)str = *(char*)ptr;
     str = (char*)str + 1;
      ptr = (char*)str + 1;
  }
  return ret;
}

在内存重叠时使用memcpy可能出现其他结果,这时使用memmove,不会重现重叠,数据覆盖

例如  

memmove

2b8e13b8102648f8954b11bbd393a5a2.png

void* memmove(void* destinnation, void* source, size_tnum)

a3a9c6f54ea64672ba8ed97f93113954.png

int main()
{
  int  arr1[] = {1,2,3,4,5,6,7,8,9};
  int  arr2[] = { 1,2 };
  memmove(arr2+2, arr1, 12);//把arr1中的5个整形拷贝到arr2中 
  return 0;
}

函数实现

void* my_memmove(const void* str, const void* ptr, size_t num)
{
  //从前往后拷贝和从后往前拷贝
  //分情况讨论
  //当str<ptr  从前往后拷贝
  //当str>ptr  从后往前拷贝
  assert(str && ptr);
  void* ret = str;
  if (str < ptr)
  {   
    *(char*)str = *(char*)ptr;
    str = (char*)str + 1;
    ptr = (char*)str + 1;
  }
  else
  {
    //后->前
    while (num--)
    {
      *((char*)str + num) = *((char*)ptr + num);
    }
  }
  return ret;
}

这里存在分情况讨论是因为如图

4594c406215e4a9d8ce3d52eaea0227f.png

memcmp

1ce94f6f094245c1b653c0608a78c8d3.png

cecc5ab60d19407390cc9e9a703f98ab.png

void test()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9 };
  int arr1[] = { 1,2,4,6 };
  int ret = memcmp(arr,arr1, 16);
  printf("%d\n", ret);
}

memset

19e4e168727749e2abe076dbb114d88b.png

025bb07699cc4d7fb5ade84ab9c5ad09.png

相关文章
|
1月前
|
存储 人工智能 搜索推荐
一种专为AI代理设计的内存层,能够在交互过程中记忆、学习和进化
Mem0 是专为 AI 代理设计的内存层,支持记忆、学习与进化。提供多种记忆类型,可快速集成,适用于开源与托管场景,助力 AI 代理高效交互与成长。
306 123
一种专为AI代理设计的内存层,能够在交互过程中记忆、学习和进化
|
3月前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
262 15
|
10月前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
370 6
|
12月前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
188 0
|
11月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
326 1
|
程序员 C语言 C++
【C语言基础】:动态内存管理(含经典笔试题分析)-2
【C语言基础】:动态内存管理(含经典笔试题分析)
|
程序员 编译器 C语言
【C语言基础】:动态内存管理(含经典笔试题分析)-1
【C语言基础】:动态内存管理(含经典笔试题分析)
|
Java 数据库连接 C语言
C语言进阶教程(内存分配常见问题分析)
C语言进阶教程(内存分配常见问题分析)
139 0
|
存储 缓存 算法
C语言内存问题详细分析之完善
C语言内存问题详细分析之完善
178 0
C语言内存问题详细分析之完善