需要知道的字符串函数

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

前言

者:小蜗牛向前冲

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

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

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



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

啥长度受限制的字符串函数呢?它是相对于长度不受限制的字符串函数(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和字符分类函数

 


相关文章
|
1月前
|
安全 C语言 C++
|
存储 C语言
字符串函数介绍&应用(一)
字符串函数介绍&应用
|
存储 C语言
字符串函数介绍&应用(二)
字符串函数介绍&应用
|
6月前
字符串函数
字符串函数
|
11月前
|
C语言
字符函数和字符串函数(上)
字符函数和字符串函数
|
编译器
C详细的字符串函数
C详细的字符串函数
67 0
|
C语言
一文带你玩转C库中的一系列字符串函数
一文带你玩转C库中的一系列字符串函数
66 2
|
编译器 C++
【字符串函数原来还能这样用?】
【字符串函数原来还能这样用?】
62 0
字符串函数剖析(2)
字符串函数的重点: 文章不长,是为了让你一点点消化所有内容: 在这里插入图片描述