strspn 这个库函数是真的很难理解,看了很多中文描述,反正都是不知所云,给出一系列的例子,结果也是让我瞠目结舌,荒唐、荒谬、荒诞!

特此记录理解过程,最后竟然是百度百科让我明白了这个库函数的意思。

中文的描述真的是太困难了,想用一两句话去说清楚往往不知所云。百度百科上最后给出了这个函数的定义,也就是这个函数是如何实现的,看了几遍才恍然大悟!

因此我也按照这个理解的顺序给出解释(没有耐心读的,不要往下看了,用心的东西往往需要花时间体会!),先给出函数的定义:

int strspn(const char *s,const char *accept)
{const char *p;const char *a;int count = 0;for(p = s; *p != '\0'; ++p){for (a = accept; *a != '\0'; ++a){if (*p == *a){++count;break;}}   //里面的for循环到此为止if (*a == '\0'){return count;}}   //外面的for循环到此为止return count;
}

可以这么说,如果你看懂了这个函数定义,难道还不能理解这个函数?

比任何的中文解释更清晰!

那关键是你能看懂这个函数,如果看不懂那就回去再补补基础。

声明:下面这段中文解释如果看不懂,那就自己理解上面的程序,别看了,有些东西只可意会不可言传!

这里为了方便看,对上面函数的定义的要点提出来几点:

关键的是for循环语句的嵌套,内部for函数:

for (a = accept; *a != '\0'; ++a){if (*p == *a){++count;break;}}   //里面的for循环到此为止

什么意思呢?就是将accept这个字符数组中的所有字符与目的字符数组 s 中的字符比较,如果相等,则计数器加1,那比较到什么时候结束呢?

比较到accept中的所有字符没有一个与s中字符相等,这时执行内层for循环后面的一条语句:

 if (*a == '\0'){return count;}

这不就是直接返回一个值,就是至此为止的计数值。


当你使用这个函数的使用,当然不需要自己定义,因为这是库函数中定义的,所以,你只需要源程序开头带上#include<string.h>这个头文件即可!

下面举几个例子,看看测试结果:

这是第一个测试的例子:

#include <stdio.h>
#include <string.h>int main () {int len;const char str1[] = "25,142,330,Smith,J,239-4123";const char str2[] = ",0123456789";len = strspn(str1, str2);printf("Length of initial segment matching %d\n", len );return(0);
}

结果为:

在这个地方,发现了一个神器,在线写程序并编译的地址:Online C Compiler

http://tpcg.io/luVeGa

再给出一个测试例子:

#include <stdio.h>
#include <string.h>int main () {int len;const char str1[] = "25,142,330,Smith,J,239-4123";const char str2[] = "0123456789";len = strspn(str1, str2);printf("Length of initial segment matching %d\n", len );return(0);
}


对了,还有一个于此互补的函数 strcspn,它的作用与上面的函数互补,为了说明清楚,我们给出两个函数的函数原型,便于讨论:

size_t strspn( char const *str, char const *group );

size_t strcspn( char const *str, char const *group );

group字符串指定一个或多个字符。strspn返回str起始部分匹配 group 中任意字符的字符数。这只是一个不太清晰的总结,具体看上面的内容。

strcspn函数和strspn函数正好相反,它对str字符串起始部分中不与group 中任何字符匹配的字符进行计数。 strcspn 这个名字中字母c来源于一组字符求补这个概念,也就是把这些字符换成原先并不存在的字符。

上面这一小段来自于《C与指针》,仅供参考,我也不太明白它在说什么?

举几个例子说明一下吧:

#include <stdio.h>
#include <string.h>int main () {int len;const char str1[] = ",142,330,Smith,J,239-4123";const char str2[] = "0123456789";len = strcspn(str1, str2);printf("Length of initial segment matching %d\n", len );return(0);
}

str2字符数组中每一个字符都不与str1字符数组中的第一个字符相等,故计数加1,然后str2中有字符与str1第2个字符匹配的了,说了函数直接返回结果为1.

为了与之对比,我在举一个例子:

#include <stdio.h>
#include <string.h>int main () {int len;const char str1[] = ",,,Smith,J,239-4123";const char str2[] = "0123456789";len = strcspn(str1, str2);printf("Length of initial segment matching %d\n", len );return(0);
}


这里根据我的想法,我想给出strcspn的大致定义,应该是这样的:


int strcspn(const char *s,const char *accept)
{const char *p;const char *a;int count = 0;for(p = s; *p != '\0'; ++p){for (a = accept; *a != '\0'; ++a){if (*p == *a){return count;}}   //里面的for循环到此为止if (*a == '\0'){++ count;}}   //外面的for循环到此为止return count;
}

不信的话,下面我来测试下它的功能:

#include <stdio.h>
#include <string.h>int main () {int len;const char str1[] = ",,,Smith,J,239-4123";const char str2[] = "0123456789";//函数原型int my_strcspn(const char *s,const char *accept);len = my_strcspn(str1, str2);printf("Length of initial segment matching %d\n", len );return(0);
}int my_strcspn(const char *s,const char *accept)
{const char *p;const char *a;int count = 0;for(p = s; *p != '\0'; ++p){for (a = accept; *a != '\0'; ++a){if (*p == *a){return count;}}   //里面的for循环到此为止if (*a == '\0'){++ count;}}   //外面的for循环到此为止return count;
}

运行得到:

运行示意

可见,结果符合预期!

就到这里吧,最后给出几个不错的网址:

https://baike.baidu.com/item/strspn

https://www.tutorialspoint.com/c_standard_library/c_function_strspn.htm

【 C 】高级字符串查找之 strspn 和 strcspn 的思考相关推荐

  1. C语言学习笔记---字符串对比函数strspn()和strcspn()函数

    strspn()函数   如果要对比两个字符串中从第一个字符开始总共有多少个相同字符时,可以使用strspn()函数,它里面有两个参数字符串1和字符串2,从字符串1开始位置依次对比字符串1和字符串2有 ...

  2. 【 C 】高级字符串查找之查找标记(token)函数 strtok介绍

    一个字符串常常包含几个单独的部分,它们彼此被分隔开来.每次为了处理这些部分,你首先必须把它们从字符串中抽取出来. 这个任务有#include<string.h>中的strtok函数完成.( ...

  3. C和指针之字符串strspn、strcspn函数源代码的实现

    1.strspn strcspn介绍 1)size_t strspn(const char *str, const char * accept); 我的理解是字符串str中前面连续的字符有多少在acc ...

  4. C语言用函数字符串的查找,字符串查找函数,C语言字符串查找函数详解

    在对 C 语言的编程实践中,字符串查找是最频繁的字符串操作之一,本节就对常用的字符串查找函数做一个简单的总结. 使用 strchr 与 strrchr 函数查找单个字符如果需要对字符串中的单个字符进行 ...

  5. strspn、strcspn、strchr、strrchr特殊字符校验

    strspn.strcspn.strchr.strcchr特殊字符校验 一.strspn 1.函数定义 2.参数 3.返回值 4.demo 二.strcspn 1.函数定义 2.参数 3.返回值 4. ...

  6. C语言字符串查找基础----strchr()、strrchr()、strpbrk()、strstr()

    1.查找一个字符 在一个字符串查找一个特定字符最容易的方法是使用strchr和strrchr函数,原型如下所示: char *strchr(char const *str, int ch); char ...

  7. C语言的字符串查找函数

    C/C++ string库(string.h)提供了几个字符串查找函数,如下: memchr 在指定内存里定位给定字符 strchr 在指定字符串里定位给定字符 strcspn 返回在字符串str1里 ...

  8. KMP 算法并非字符串查找的优化 [转]

    算法书和数据结构书对 KMP算法多有介绍,称只需对字符串扫描一遍不需回溯云云 .然而 ,它恐怕只应该作为一种思想存在 ;用于实际的字符串查找并不理想 .要费劲心血实现和优化它 ,才能在特定的字符串上略 ...

  9. 字符串查找函数 php,php字符串查找函数(strrpos与strchr)

    本节内容: php中的字符串函数strrpos与strchr,实现字符串查找方法. strchr(等同于strstr): 语法: string strstr(string haystack,strin ...

最新文章

  1. 浙大这个班诞生128家创业公司,总市值高达千亿!
  2. Python-使用python-memcache操作Memcached
  3. Intel汇编语言程序设计学习-第六章 条件处理-上
  4. 【计算机网络】网络层 : IP 组播 ( IP 数据报传输方式 | 组播 IP 地址 | 组播 MAC 地址 | IGMP 协议 | 组播路由选择协议 )
  5. IDEA中进行SpringBoot开发时提示:Error resolving template xxx, template might not exist or might not be acce
  6. 小程序·云开发实战 - 体重记录小程序
  7. ASP.NET Core 3.0 实战:构建多版本 API 接口
  8. C#枚举中使用Flags特性
  9. 2020-08-18 每日一句
  10. oracle讲师视频教程,赵强老师:Oracle数据库系列视频课程
  11. Word 2016 插入尾注之后删除方法
  12. Keil编译*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
  13. 2021年美赛资料准备
  14. HDU 3954 level up 线段树
  15. 好用的在线画图工具processon
  16. PySide2 环境安装
  17. 东南大学信息科学工程学院在计算机,【东南大学计算机科学与工程学院】疑问咨询贴...
  18. Linux 离线安装.net sdk
  19. 从商品溯源到历史载录,区块链技术的革新
  20. rot5/rot13/rot18/rot47

热门文章

  1. 【高效使用】生产力提升
  2. 根据身份证号码导出生日和性别(JavaScript代码)
  3. 饥荒联机版连不上服务器_饥荒联机版不搜索房间直连服务器教程 搜索不到房间怎么办_游侠网...
  4. android内存加载dex,安卓8.1版本dex加载流程笔记--第一篇:oatfile,oatdexfile与dexfile...
  5. java 调用父级方法_java子类调用父类的方法中包含子类重写的实例方法
  6. 主板uefi和传统引导方式区别_反吊膜与传统污水池加盖方式有什么区别
  7. 三星emcp型号详解_Samsung eMCP(三星eMCP).pdf
  8. python表单切换_python3 selenium自动化 frame表单嵌套的切换方法
  9. 三极管的耐压与hFE之间是什么关系?
  10. Grove Beginner Kits基础实验 Arduino