当前位置:首页 » 《休闲阅读》 » 正文

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

8 人参与  2024年09月29日 09:21  分类 : 《休闲阅读》  评论

点击全文阅读


目录

前言:

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://zhangshiyu.com/post/166033.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1