需要知道的字符串函数

简介: 需要知道的字符串函数

前言

者:小蜗牛向前冲

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

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

本次博主将继续上篇博客对字符串函数进行进一步的补充。



长度受限制的字符串函数介绍

啥长度受限制的字符串函数呢?它是相对于长度不受限制的字符串函数(strcmp,strcpy,strcat)这些函数他们都是遇到'\0'才会停止函数的功能,但这些会存在一些不安全的情况,以strcpy字符串拷贝函数举例,当存放目标字符串空间比源字符串小时,拷贝仍然会进行,从而导致程序崩溃。

所以,为了更加安全的使用相应功能,长度受限制的字符串函油然(strncmp,strncpy,strncant)。下面我会为大家一一刨析。

strncpy函数

定义

参数

strncpy(strDest,strSource,count);

其中的strDest指目标字符串

strSource指源字符串

count指要要从源字符串中拷贝到目标字符串的字符个数。

举例实现

int main()
{
  char arr1[5] = "he";
  char arr2[10] = "hehewang";
  strncpy(arr1, arr2, 4);//受限制的字符串拷贝
  printf("%s\n", arr1);
  return 0;
}

下面我们继续模拟实现strncpy函数

char* my_strncpy(char* dest, char* source, size_t count)
{
  assert(dest && source);//断言
  char* start = dest;//保存好目标字符串的地址
  while (count && (*dest++ = *source++) != '\0')
  {
    count--;//每拷贝一个要拷贝的字符就少一个
  }
  if (count)//若conut指的字符个数大于拷贝个数                              
    while (--count)
      *dest++ = '\0';//超出的部分都置0
  return (start);
}

对于strncpy是为更加安全的使用字符串拷贝而出现的函数。

功能:

可以根据自己的需求拷贝多少个字符。

头文件:

.

返回值:

返回的是目标字符串的首地址。

strncmp函数

定义

参数

strncmp(str1,str2,count);

返回值

我们知道strncmp和strcmp的功能是及其相似的,但strncmp更加高明的地方是能实现我们想要的字符进行比较。

举例说明

int main()
{
  char* p1 = "abcdfeg";
  char* p2 = "abed";
  int ret = strncmp(p1, p2, 3);
  if (ret > 0)
  {
    printf("p1>p2\n");
  }
  else if (ret < 0)
  {
    printf("p1<p2\n");
  }
  else
  {
    printf("p1=p2");
  }
  return 0;
}

模拟strncpy

int my_strncmp(const char* p1, const char* p2, size_t count)
{
  assert(p1 && p2);//断言
  //首先判断是否相等
  while ((*p1 == *p2)&&count)
  {
    count--;//每判断一个字符就--
    if (count==0)
    {
      return 0;//p1==p2
    }
    p1++;
    p2++;
  }
  return (*(unsigned char*)p1 - *(unsigned char*)p2);//返回
}

功能

对字符串经行有限制的比较

头文件

strncat函数

定义

参数

strncat(dest,Soure,count);

strncat是有限制的追加字符串。

返回值是返回目标字符串的首地址

头文件

举例说明

#define  _CRT_SECURE_NO_WARNINGS
 
#include<stdio.h>
#include<string.h>
 
int main()
{
  char arr1[10] = "menace";
  char arr2[5] = "mehe";
  strncat(arr1, arr2, 2);
  printf("%s\n", arr1);
  return 0;
}

模拟实现

char* my_strncat(char* dest, const char* source, size_t count)
{
  assert(dest && source);//断言
  //找到目标字符串的'\0'
  char* start = dest;
  while (*dest != '\0')
  {
    dest++;
  }
  while (count && (*dest++ = *source++))//进行追加
  {
    count--;
  }
  *dest = '\0';//在目标字符串末尾放上字符串结束的标志
  return start;
}

可能有不有疑问,回目标字符串的首地址有上面用呢?我暂时想到的是便于打印字符串。

字符串查找函数

下面我将为大家主要介绍C语言字符串查找函数(strstr,strtok)

strstr函数

定义

参数

strstr(str1,str2);

功能

strstr函数用来寻找子字符串的,是寻找str1中是否存在str2的子字符串

返回值

返回指向 str1 中第一次出现的 str2 的指针,如果子字符串不存在,那么就返回空指针。

头文件

举例说明

int main()
{
  char* p1 = "amcdefme";
  char* p2 = "def";
  char* ret = strstr(p1, p2);//存储函数的返回值
  if (NULL == ret)
  {
    printf("子串不存在\n");
  }
  else
  {
    printf("%s\n", ret);//打印找到的子字符串
  }
  return 0;
}

注意如果出现而份子字符串,函数返回的第一次出现子字符串的首地址。

模拟实现strstr

char* my_strstr(const char* p1, const char* p2)
{
  assert(p1 && p2);//断言
  char* s1 = NULL;
  char* s2 = NULL;//准备二个char*类型的空指针
  char* pt = (char*)p1;//存放找到子字符串的起始地址
  //判断p2是否为空指针
  if (*p2 == '\0')
  {
    return (char*)p1;//子字符串必定存在
  }
  //开始查找是否存在子字符串
  while (*pt)
  {
    s1 = pt;//指向要查找的位置
    s2 = (char*)p2;//指向要子字符串
    while (*s1 && *s2 && (*s1 == *s2))//逐个分析字符串是否相等,从而推断子字符串是否存在
    {
      s1++;
      s2++;
    }
    if ('\0' == *s2)//说明找到了子字符串
    {
      return pt;//返回子字符串第一次出现的的首地址
    }
    pt++;//没找到继续向下找
  }
  return (char*)NULL;//没找到
}

这个模拟实现还是比较经典的,有兴趣的小伙伴可以动手尝试。

strtok函数

定义

参数

strtok(strToken,strDelimit)

strDelimit参数是个字符串,定义了用作分隔符的字符集合

第一个参数指定一个字符串,它包含了0个或者多个由strDelimi字符串中一个或者多个分隔符分割的标记。

strtok函数找到strToken中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。)

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

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

如果字符串中不存在更多的标记,则返回 NULL 指针。

strtok举例说明

#define  _CRT_SECURE_NO_WARNINGS
 
#include<stdio.h>
#include<string.h>
 
int main()
{
  char arr[] = "990.321@321*100";//字符串
  char p[] = ".@*";//分隔符
  char* ret = NULL;
  for (ret = strtok(arr, p);ret != NULL;ret = strtok(NULL, p))
  {
    printf("%s\n",ret);//打印分割的字符串
  }
  return 0;
}

报告错误信息

下面我将继续为大家分享,报告错误信息函数strerror函数

定义

参数

strerror函数

能够获取系统错误消息 (strerror) 或打印用户提供的错误消息 (_strerror)。

返回值:

strerror 和 _strerror返回指向错误消息字符串的指针。对 strerror 或 _strerror 的后续调用可能会覆盖该字符串。

头文件:

举例说明

char* str = strerror(errno)

//errno是一个全局的错误码的变量

//当C语言的库函数在执行过程中,发生了错误,就会把对应的错误码,赋值到errno。

#define  _CRT_SECURE_NO_WARNINGS
 
#include<stdio.h>
#include<string.h>
 
int main()
{
  FILE* pf = fopen("test.txt", "r");//查找文件
  if (pf == NULL)
  {
    printf("%s\n", strerror(errno));
  }
  else
  {
    printf("open file success\n");
  }
  return 0;
}
 

注意:

我们这里借用fopen函数能够打开文件的函数,其中的参数1(指的是文件),参数2(指的是打开文件的方式)

FILE*是一种指针类型。

这里当系统读不到此文件时,通过strerror(errno)我们能够将错误信息该我们展示出来。

对于strerror函数总结:

strerror()能将代码执行过程中的错误,报出了。

strerror()的参数是1,2,3,4,5.......这类型的错误码,我们可以用errno全局的静态变量接收。

字符分类函数

在c语言中有许多字符分类函数,下面我们用图表来展示:

函数 如果他的参数符合下列条件就返回真
iscntrl 任何控制字符
isspace 空白字符:空格‘ ’,换页‘\f’,换行'\n',回车‘\r’,制表符'\t'或者垂直制表符'\v'
sdigit 十进制数字 0~9
isxdigit 十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~F
islower 小写字母a~z
isupper 大写字母A~Z
isalpha 字母a~z或A~Z
isalnum 字母或者数字,a~z,A~Z,0~9
ispunct 标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph 任何图形字符        
isprint 任何可打印字符,包括图形字符和空白字符

显示详细信息

下面我们对部分字符分类函数经行说明

islower函数判断字符是否为小写字母

定义

参数

举例说明

int main()
{
  char ret = 0;
  scanf("%c", &ret);
  if (islower(ret) != '\0')
  {
    printf("小写字母\n");
  }
  else
  {
    printf("不是小写字母\n");
  }
  return 0;
}

下面就不继续为大家介绍了,大家兴趣的话,可以动手去研究。

总结

在这篇博客,主要为大家介绍了,strncpy,strncmp,strncat这些受限制的字符串函数;与字符查找函数strstr(查找子字符串),strtok(查找被分隔符分割的字符串);及报告错误信息函数strerror和字符分类函数

 


相关文章
|
SQL 存储 分布式计算
ODPS开发大全:入门篇(1)
ODPS开发大全:入门篇
1463 14
|
存储 关系型数据库 索引
Storage Developer Conference 2020总结
Storage Developer Conference 2020总结
162 0
|
设计模式 Java
深入剖析Thread与Runnable关系 | 带你学《Java语言高级特性》之四
既然实现了Runnable的类能够传入Thread构造方法完成新的线程的生成,说明他们之间存在一定的联系,本节将为你揭晓此中奥秘。
深入剖析Thread与Runnable关系 | 带你学《Java语言高级特性》之四
|
程序员
第11章 假如没有编程 《丰富多彩的编程世界》
第11章 假如没有编程 《丰富多彩的编程世界》 丰富多彩的编程世界 作者 陈光剑 第1章 名可名非常名第2章 语言的构成第3章 有趣的编程第4章 编程语言大观第5章 编程语言的组成第6章 编程范式第7章 编程思想第8章 编程心理学第9章 程序员这群人...
912 0
|
4天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
279 116
|
19天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
6天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
395 38
Meta SAM3开源:让图像分割,听懂你的话