C:字符串函数(完)-学习笔记

server/2024/11/12 9:42:27/

目录

前言:

1、strstr

1.1 strstr的使用

4.2 strstr的模拟实现

5、strtok

5.1 strtok函数的介绍

 5.2 strtok函数的使用

6、strerror


前言:

这篇文章将介绍strstr函数,strtok函数,strerror函数

1、strstr

1.1 strstr的使用

strstr  --- string string

在一个字符串中,找一个字字符串,找第一次出现的位置

 

我们来尝试使用strstr函数:

    char arr1[ ] = "abcdefabcdef ";char arr2[ ] = "def";char* ret = strstr(arr1, arr2);if (ret == NULL)printf("找不到\n");elseprintf("找到了,%s\n", ret);

这就是strstr函数的作用,通常用来找一个字符串。

4.2 strstr的模拟实现

我们来尝试一下模拟strstr函数(这里小编学的有点模糊,因此可能会有些问题,还望理解,如果后面有时间会来修改)

第一次匹配成功

上面是比较简单的场景,匹配一次便成功了,那如果需要多次匹配呢?

 

#include <stdio.h>
#include <string.h>
#include <assert.h>
const char* my_strstr(const char* str1, const char* str2)//只寻找,不希望改变,所以使用const修饰
{assert(str1 && str2);const char* s1 = str1;const char* s2 = str2;const char* cur = str1;//cur指针记可能的开始匹配的位置if (*str2 == '\0')//当str2是空字符串时,直接返回str1return str1;while (*cur){//完成一次匹配s1 = cur;s2 = str2;while (*s1 && *s2 && *s1 == *s2){s1++;s2++;}if (*s2 == '\0')return cur;cur++;}return NULL;
}
int main()
{char arr1[ ] = "abcdefabcdef ";char arr2[ ] = "def";char* ret = my_strstr(arr1, arr2);if (ret == NULL)printf("找不到\n");elseprintf("找到了,%s\n", ret);return 0;
}

5、strtok

5.1 strtok函数的介绍

strtok的作用就是通过分隔符切割字符串

char * strtok ( char * str,const char * sep );
  •  sep参数指向一个字符串,定义了用作分隔符的字符集合
  • 第一个参数指定一个字符串,它包含了0个或者多个有sep字符串中一个或者多个分隔符分隔的标记
  • strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以被strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。
  • strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  • strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,直接下一个标记。
  • 如果字符串中不存在更多的标记,则返回NULL指针。

先来说明一下strtok的使用场景:

char arr1[ ] = " zhangsan@year.ch"

char arr2[ ] ="www.hawei.com"

char arr3[ ] = " 123.234.345"

我们来一句一句解释上面的介绍

sep参数指向一个字符串,定义了用作分隔符的字符集合

char arr1[ ] = " zhangsan@year.ch"

上面的字符串中的分隔符是哪些呢?

‘@’、‘.‘

我们将这些分隔符放在一起就叫做分隔符的集合

sep中方的就是"@ ."

如果你要切割字符串char arr1[ ] = " zhangsan@year.ch"

你可以写一个数组char str[ ] = "@ ."

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

char arr1[ ] = " zhangsan@year.ch"

这里面的标记有zhangsan,year,ch。

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

char arr1[ ] = " zhangsan@year.ch"

str开始会先找到zhangsan这个标记,并且把这个标记的结尾改为\0,也就是说会把@改为\0

zhangsan@year.ch

zhangsan\0year.ch

同时会返回指向这个标记的指针

由于strtok会改变被操作的字符串,所以为了防止字符串被修改,一般都会临时拷贝原字符串

从上图中我们可以看到arr1中的@被改为了\0,这样arr1就会被破坏。因此为了防止破坏原数组,我们可以这样使用

int main()
{char arr1[] = "zhangsan@year.ch";char sep[] = "@.";char buf[30] = { 0 };strcpy(buf, arr1);//临时拷贝arr1中字符串到buf中char * p = strtok(buf, sep);return 0;
}

这样我们可以随意修改buf中的元素而不会对原数组照成影响。

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

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

char arr1[ ] = " zhangsan@year.ch"

int main()
{char arr1[] = "zhangsan@year.ch";char sep[] = "@.";char buf[30] = { 0 };strcpy(buf, arr1);//临时拷贝arr1中字符串到buf中char * p = strtok(buf, sep);return 0;
}

1. 第一个参数不为 NULL 时

  • strtok函数的第一个参数不为NULL时,它接收一个字符串作为起始处理的对象(假设这个字符串为str)。
  • 函数会根据指定的分隔符(通常在后续调用中指定)在str中查找第一个分隔符。
  • 找到第一个分隔符后,它会将分隔符替换为'\0',这样就把原始字符串str分割成了两部分,函数返回的是分隔符之前的子字符串(第一个标记)。
  • 同时,strtok函数会在内部保存当前处理的位置,这个位置是指刚刚找到的分隔符之后的字符位置,以便后续继续处理字符串的剩余部分

2. 第一个参数为 NULL 时

  • strtok函数的第一个参数为NULL时,它不会再接收新的字符串,而是基于上一次调用strtok时保存的位置继续处理同一个字符串。
  • 它会从上次保存的位置开始,查找下一个分隔符,同样将分隔符替换为'\0',然后返回新的子字符串(下一个标记)。
  • 这个过程可以重复,直到字符串中没有更多的分隔符为止。

 5.2 strtok函数的使用

int main()
{char arr1[] = "zhangsan@year.ch";char sep[] = "@.";char buf[30] = { 0 };strcpy(buf, arr1);//临时拷贝arr1中字符串到buf中char* p = NULL;for (p = strtok(buf, sep); p != NULL; p = strtok(NULL, sep)){printf("%s\n", p);}return 0;
}

6、strerror

char * strerror (int errnum);

strerror 函数可以把参数部分错误码对应的错误信息的字符串地址返回来。 在不同的系统和C语言标准库的实现中都规定了一些错误码,一般是放在 errno.h 这个头文件中说明的,C语言程序启动的时候就会使用一个全局的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会将对应的错误码,存放在errno中,而一个错误码的数字是整数很难理解是什么意思,所以每一个错误码都是 有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。

errno变量用来记录该程序中的错误代码信息

int main()
{int i = 0;for (i = 0; i < 10; i++){printf("%d:%s\n",i, strerror(i));}return 0;
}

这里每一个数字对应的都是一个错误码。这里只是为了展示一下错误信息,并不是函数strerror的用法。

关于用法小编目前还没有学到,等到后面再来补充。


结语:本篇文章到这里就结束了,希望能够对大家有所帮助。


http://www.ppmy.cn/server/119296.html

相关文章

微软九月补丁星期二发现了 79 个漏洞

微软将在2024 年 9 月补丁星期二修复 79 个漏洞。 微软有证据表明&#xff0c;发布的四个漏洞被野外利用和/或公开披露&#xff1b;所有四个漏洞均已在CISA KEV上列出。微软还在修补四个关键的远程代码执行 (RCE) 漏洞。 不同寻常的是&#xff0c;微软本月尚未修补任何浏览器…

图像处理软件,常用于照片编辑和修饰

一、简介 1、一款功能强大的图像处理软件&#xff0c;常用于照片编辑和修饰。它提供多种工具和特效&#xff0c;允许用户调整照片的亮度、对比度、色彩、锐化等 二、下载 1、文末有下载链接,不明白可以私聊我哈&#xff08;麻烦咚咚咚&#xff0c;动动小手给个关注收藏小三连&a…

科创孵化昌平,创新创业求发展

昌平区&#xff0c;作为北京市科技创新和产业发展的新高地&#xff0c;近年来在多个前沿领域展现出蓬勃的生命力和巨大的发展潜力。在这片充满活力的土地上&#xff0c;青年创业者们正以前所未有的热情和智慧&#xff0c;投身于创新创业的大潮中&#xff0c;共同书写着昌平区发…

Vue 实现高级穿梭框 Transfer 封装

文章目录 01 基础信息1.1. 技术栈1.2. 组件设计a. 竖版设计稿b. 横版设计稿 02 技术方案&#xff08;1&#xff09;初定义数据&#xff08;2&#xff09;注意事项&#xff08;3&#xff09;逻辑草图 03 代码示例3.1. 组件使用3.2. 组件源码./TransferPlus/index.vue./TransferP…

EasyExcel 快速入门

目录 一、 EasyExcel简介 官网链接&#xff1a; 代码链接&#xff1a; 二、 EasyExcel快速上手 引入依赖&#xff1a; 设置Excel相关注解 编写对应的监听类&#xff1a; 简单写入数据&#xff1a; 简单读取数据&#xff1a; 不需要使用监听器&#xff1a; 需要使…

MySQL数据库迁移与备份实录

这里写目录标题 事情起因的概述查看磁盘空间使用情况为了进一步的明确宕机原因&#xff0c;查看MySQL日志信息进一步排查 如何针对磁盘空间不足进行挂载区域的修改以及数据的迁移与备份分析与梳理如何修改MySQL数据卷的挂载位置停止MySQL服务备份 MySQL 配置文件迁移 MySQL 数据…

基于springboot+vue图书管理系统的设计与实现

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;图书信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…

基于剪切板的高速翻译工具

下载 关键代码 #include <curl/curl.h> std::wstring get_current_clipboard(HWND hwnd) {if (!OpenClipboard(hwnd)) {return L"";}HANDLE h = GetClipboardData(CF_UNICODETEXT);if (!h) {CloseClipboard();return L"";}wchar_t* data = (wchar_t…