库函数之字符函数与字符串函数(下)

简介: 库函数之字符函数与字符串函数(下)

一、strncpy函数,strncat函数,strncmp函数


头文件:#include <string.h>


看过上一篇的小伙伴们都知道,对于下列函数应该都有所了解.


strcpy函数:.拷贝字符串函数


strcat函数:.追加字符函数


strcmp函数:.字符串拷贝函数


这些函数在使用时,都是遇到’\0’,才停止他们的拷贝,追加,比较等操作


如果我们想要只操作其中的部分,就可以增加一个参数来实现.


由于功能参数等与前面的函数相似,本篇不做重点讲解.


函数作用


strncpy函数


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


strncat函数


追加num个源字符到目标空间


strncmp函数


比较两个字符串的前num个字符,返回值与strcmp一致.


函数参数模型


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


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


int strncmp ( const char * str1, const char * str2, size_t num );


参数介绍


增加一个size_t 类型的参数num,用于限定原来的函数.


模拟实现strncpy


#include <stdio.h>
#include <assert.h>
char* my_strncpy(char* strDest, const char* strSource, size_t count)
{
  assert(strDest);
  assert(strSource);
  char* ret = strDest;
  while (count--)
  {
    *strDest++ = *strSource++;
  }
  return ret;
}
int main()
{
  char arr1[20] = "xxxxxxxxxxxxxx";
  char arr2[] = "Hello CSDN!";
  int sz2 = sizeof(arr2) / sizeof(arr2[0]);
  printf("%s", my_strncpy(arr1,arr2,5));
  return 0;
}


运行结果:


Helloxxxxxxxxx


注意:


1.strncpy只拷贝num个字符,并不会额外附加’\0’字符.


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


这个在模拟的时候并没有添加上去.


模拟实现strncat函数


#include <stdio.h>
#include <assert.h>
char* my_strncat(char* destination, const char* source, size_t num)
{
  assert(destination);
  assert(source);
  char* ret = destination;
  while (*destination != '\0')
  {
    destination++;
  }
  while (num--)
  {
    *destination++ = *source++;
  }
  return ret;
}
int main()
{
  char arr1[20] = "Hello ";
  char arr2[] = "CSDN!";
  int sz2 = sizeof(arr2) / sizeof(arr2[0]);
  printf("%s", my_strncat(arr1, arr2, 3));
  return 0;
}


运行结果:


Hello CSD


模拟实现strncmp函数


#include <stdio.h>
#include <assert.h>
int my_strncmp(const char* str1, const char* str2, size_t num)
{
  while (num--)
  {
    if (*str1 > *str2)
    {
      return 1;
    }
    else if (*str1 < *str2)
    {
      return -1;
    }
    str1++;
    str2++;
  }
  return 0;
}
int main()
{
  char arr1[20] = "aabbccdd";
  char arr2[] = "aabbcdef";
  int sz2 = sizeof(arr2) / sizeof(arr2[0]);
  printf("%d", my_strncmp(arr1, arr2, 5));
  return 0;
}


运行结果:


0


解释:


因为前5个字符相同,num个字符比较结束,认为是相同字符串.


二、strstr函数


strstr函数


头文件:#include <string.h>


函数参数模型



函数作用:


用于查找主字符串中是否包含子字符串.包含返回第一次匹配成功的字符首地址.不包含则返回NULL.


函数的应用


力扣------找出字符串中第一个匹配的下标.


通过strstr函数找到第一个匹配的字符指针,


该指针-字符串首地址指针=该字符的下标.


int strStr(char * haystack, char * needle){
    char*ret=strstr(haystack,needle);
    if(ret-haystack<0)//小于0时,返回-1;
    {
        return -1;
    }
    return ret-haystack;
}


模拟实现


  1. 创建三个指针


  1. p1指向主字符串首地址,p2指向子字符串首地址.


  1. ret用于保存p1回退的位置.


  1. 当*p1==p2时,p1和p2继续向后比较,当p1!=*p2时,说明ret位置不对,则ret++


  1. p1退回到ret位置,p2回到初始位置,重新比较.


  1. 直到p2指向’\0’,则匹配成功,p1指向’\0’则匹配失败.



动图解析:



代码实现:


#include <stdio.h>
#include <assert.h>
char* my_strstr(const char* str1, const char* str2)
{
  assert(str1 && str2);
  if (*str2 == '\0')//如果子字符串是空字符串,直接返回主字符串
  {
    return str1;
  }
  const char *ret,*p1,*p2;
  ret = p1 = str1;
  p2 = str2;
  while (*p1&&*p2)//循环停止条件为主字符串或者子字符串有一个为空
  {
    if (*p1 == *p2)//相等则继续比较
    {
      p1++;
      p2++;
    }
    else//不相等则返回指定位置重新比较
    {
      p1 = ++ret;
      p2 = str2;
    }
  }
  if (*p2 == '\0')//如果子字符串比较结束,则匹配成功
  {
    return ret;
  }
  else//否则匹配失败
    return NULL;
}
int main()
{
  char str1[20] = "ABBCDABBACBBD";
  char str2[] = "ABBA";
  char* ret = my_strstr(str1, str2);
  if (ret == NULL)
  {
    printf("没有找到\n");
  }
  else printf("%s", ret);
}


ABBACBBD


三、strtok函数


strtok函数


头文件:#include <string.h>


函数参数模型


strtok函数



函数作用:


将字符串str根据delimiters 中的字符进行分割.


参数介绍:


参数 意义
str 需要被分隔的字符串(第一次传参的时候),传入NULL指针时,会从上一次修改的地址处
delimiters 定义了用作分隔符的字符集合


函数应用


#include <stdio.h>
#include <string.h>
int main()
{
  char str1[30] = "123.456.789_111,222@333";
  char str2[30];
  char a[] = "._,@";
  strcpy(str2, str1);//因为strtok函数会改变传过去的字符串的内容,所以我们是将备份传过去
  char* ret;
  //除了第一次调用时第一个参数为str2以外,后面的调用都是传入NULL,这样才会继续向后寻找标记分隔字符.
  for (ret = strtok(str2, a); ret != NULL; ret = strtok(NULL, a))
  {
    printf("%s\n", ret);
  }
  return 0;
}


运行结果:


123


456


789


111


222


333


strtok函数注意事项:


strtok函数并不是一次就将字符串中的所有分隔字符改为’\0’,而是调用它一次,修改一个.


strtok函数第一次调用时,会找到str中的第一个分隔符标记,并将其用 \0 结尾,然后返回一个指向这个标记的指针。


strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。:


strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。


strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。


如果后面已经没有标记分隔,则返回 NULL 指针.


四、strerror函数


sterror函数



函数作用


库函数在使用错误时,会返回一串数字,这些数字就是错误码.


strerror函数用于返回错误码对应的错误信息.


例如:


#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));
  printf("%s\n", strerror(4));
  printf("%s\n", strerror(5));
  return 0;
}


No error


Operation not permitted


No such file or directory


No such process


Interrupted function call


Input/output error


但是strerror函数并不是这样使用的,因为我们也不知道错误码是什么,像上面这种是属于提前预判了的.


在库函数执行错误后,会将错误码存放在一个error的变量中.所以一般strerror函数是这样使用的.


函数应用


#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
  //打开文件
  FILE* pf = fopen("CSDN.txt", "r");
  if (pf == NULL)
  {
    //printf("%s\n", strerror(errno));
    perror("fopen");
    return 1;
  }
  //关闭文件
  fclose(pf);
  pf = NULL;//避免空指针
  return 0;
}


perror函数等价于printf(“%s\n”, strerror(errno));


即strerror函数是返回指向错误信息的字符串地址,而perror函数是将错误信息直接打印出来.


希望这篇文章能帮助大家对c语言中的库函数有关字符函数和字符串函数有更深层的理解.

目录
相关文章
|
8天前
|
JavaScript API iOS开发
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(DSH)是DeepSeek于2026年开源的MIT协议AI Agent框架,支持插件化组装模型、工具、沙箱与UI,兼容主流大模型。本文提供免Node.js的桌面端安装包(Win/macOS),含详细图文教程及热门插件推荐。
3711 35
|
8天前
|
Linux 开发工具 iOS开发
Codex保姆级教程(下载+安装+登录+使用,含所有版本,2026最新)
Codex是OpenAI推出的开源AI编程智能体,本地运行,可理解整个代码库,支持自然语言指令改代码、执行命令、跑测试、修Bug,兼容Win/macOS/Linux。(239字)
3242 10
|
3天前
|
云安全 人工智能 安全
|
9天前
|
iOS开发 Docker MacOS
【2026实测】Docker Desktop下载、安装、汉化、配置教程(附官网安装包)
Docker Desktop 是 Docker 官方推出的桌面容器管理工具,集成引擎、CLI、图形界面与 Kubernetes,支持 Win/macOS/Linux。2026 最新版 4.88.1 强化 ARM 原生运行、镜像加速及资源可视化,附中文汉化与国内镜像配置指南。
1689 6
|
9天前
|
安全 算法 定位技术
《高性价比人生指南》完整原版:普通人用最少的资源,过好这一生的底层逻辑~How To Live Better
📖《高性价比人生指南》是一份基于实证、拒绝焦虑的生存手册,倡导以“人生时薪”为视角,重新计算时间、金钱与精力的成本与收益。它不承诺逆袭,只教人算清账:省下的钱若耗掉时间便亏;买体验比买物品更值;睡眠是最高杠杆的健康投资;关系贵在情绪价值而非表面热络;学习重在改变行为而非自我安慰。核心理念:用低成本、高回报的微小行动,换取长期的选择权——不是成为谁,而是掌控自己人生的主动权。
2031 4
|
云安全 安全 网络安全
|
22天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
3880 55
|
14天前
|
人工智能 JSON Linux
【保姆级】ComfyUI部署教程(下载+安装+配置+工作流,2026最新)
ComfyUI 是一款开源节点式AI生成工具,支持图像、视频、音频及3D内容创作。通过拖拽连线组合模型加载、提示词、采样等节点,构建可复用、易修改的工作流,兼容SD1.5、SDXL、Flux、Qwen Image等主流模型。