在对 C 语言的编程实践中,字符串查找是最频繁的字符串操作之一,本节就对常用的字符串查找函数做一个简单的总结。

使用 strchr 与 strrchr 函数查找单个字符如果需要对字符串中的单个字符进行查找,那么应该使用 strchr 或 strrchr 函数。其中,strchr 函数原型的一般格式如下:

char *strchr(const char *s, int c);

查找任何一个不包含在strcharset串中的字符 (字符串结束符null除外) 在string串中首次出现的位置指针. 返回一个指针, 指向非strcharset中的字符在string中首次出现的位置.。查找字 串string中首次出现的位置, null结束符也包含在查找中. 返回一个指针, 指向字符c在字符串string中首次出现的位置, 如果没有找到, 则返回null.。 //删除文件名,只获得路径其中使用_tcsrchr这样一个函数这是一个查找函数,从字符串中查找一个字符最后出现的位置,返回一个char*。

相对于 strchr 函数,strrchr 函数原型的一般格式如下:

char *strrchr(const char *s, int c);

与 strchr 函数一样,它同样表示在字符串 s 中查找字符 c,返回字符 c 第一次在字符串 s 中出现的位置,如果未找到字符 c,则返回 NULL。但两者唯一不同的是,strrchr 函数在字符串 s 中是从后到前(或者称为从右向左)查找字符 c,找到字符 c 第一次出现的位置就返回,返回值指向这个位置。下面的示例代码演示了两者之间的区别:

int main(void)

{

char str[] = "I welcome any ideas from readers, of course.";

char *lc = strchr(str, 'o');

printf("strchr: %s\n", lc);

char *rc = strrchr(str, 'o');

printf("strrchr: %s\n", rc);

return 0;

}对于上面的示例代码,strchr 函数是按照从前到后的顺序进行查找,所以得到的结果为“ome any ideas from readers,of course.”; 而 strrchr 函数则相反,它按照从后到前的顺序进行查找,所以得到的结果为“ourse.”。

示例代码运行结果为:

strchr: ome any ideas from readers, of course.

strrchr: ourse.

最后还需要注意的是,为什么函数的“c”参数是 int 类型,而不是“char”类型呢?

其实原因很简单,这里用的是字符的 ASCII 码(因为每个字符都对应着一个 ASCII 码),这样在传值的时候既可以传“char”类型的值,又可以传“int”类型的值(0~127)。

使用 strpbrk 函数查找多个字符上面的 strchr 与 strrchr 函数解决了对字符串中单个字符的查找,那么需要查找多个字符时怎么办呢?

在strtoken 串中查找下一个标记, strdelimit字符集则指定了在当前查找调用中可能遇到的分界符. 返回一个指针, 指向在strtoken中找到的下一个标记. 如果找不到标记, 就返回null值. 每次调用都会修改strtoken内容, 用null字符替换遇到的每个分界符.。在指定的字符串中寻找特定的字符,并返回字符串中第一个特定字符的指针,函数原型如下:。在指定的字符串中寻找特定的字符,并返回字符串中最后一个特定字符的指针,函数原型如下:。

char *strpbrk(const char *s1,const char *s2);

例如,在 strpbrk 函数的定义如下:

char *strpbrk (const char *s, const char *accept)

{

while (*s != '\0')

{

const char *a = accept;

while (*a != '\0')

if (*a++ == *s)

return (char *) s;

++s;

}

return NULL;

}如上面的代码所示,strpbrk 数首先依次循环检查字符串 s 中的字符,当被检验的字符在字符串 accept 中也包含时(即“if(*a++==*s)”),则停止检验,并返回“(char*)s”。如果没有匹配字符,则返回空指针 NULL。这里需要注意的是,空字符 null('\0')不包括在内。函数的调用示例如下面的代码所示:int main(void)

{

char str[] = "I welcome any ideas from readers, of course.";

char *rc=strpbrk(str,"come");

printf("%s\n",rc);

return 0;

}很显然,示例代码的运行结果为“elcome any ideas from readers,of course.”。

使用 strstr 函数查找一个子串相对于 strpbrk 函数,strstr 函数表示在字符串 haystack 中从前到后查找子串 needle 第一次出现的位置(不比较结束符 null('\0')),并返回指向第一次出现 needle 位置的指针,如果没找到则返回 NULL。其函数原型的一般格式如下:

char *strstr(const char *haystack, const char *needle);

strstr 函数的调用示例如下面的代码所示:

return并不是让函数马上返回,而是return语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally语句后才真正开始返回。调用时输入23和24.5,输入的这2个参数才是真正需要传递给函数的参数,ref int, ref double是告诉alien需要分配空间,调用c函数从栈中获取它的参数,调用结束后将返回结果放到栈中(为了区分返回结果和栈中的其他的值,每个c函数还会返回结果的个数),然后lua函数返回结果值。事实上,在一个进程开始运行时,windows os并不直接从主函数开始执行,而是从另外一个比较大的运行期启动函数开始执行,不同的入口函数对应的启动函数不同:应用程序类型进入点嵌入可执行文件的启动函数需要ansi字符和字符串的gui应用程序winmainwinmaincrtstartup需要unicode字符和字符串的gui应用程序wwinmainwwinmaincrtstartup需要ansi字符和字符串的cui应用程序mainmaincrtstartup需要unicode字符和字符串的cui应用程序wmainwmaincrtstartup启动函数负责对应用程序运行前期的初始化,如全局变量的内存分配等。

come:come any ideas from readers, of course.

icome:(null)

利用mid函数,返回文本串中从指定位置开始的特定数目的字符,该数目由用户指定。c提供fgetc和fputc函数对文本文件进行字符的读写,其函数的原型存于stdio.h头文件中,格式为:。将源串strsource开始的count个字符添加到目标串strdest后. 源串strsource的字符会覆盖目标串strdestination后面的结束符null. 如果count大于源串长度, 则会用源串的长度值替换count值. 得到的新串后面会自动加上null结束符. 与strcat函数一样, 本函数不能处理源串与目标串重叠的情况. 函数返回strdestination值.。

size_t strspn(const char *s, const char *accept);

例如,该函数的定义如下:

size_t strspn (const char *s,const char *accept)

{

const char *p;

const char *a;

size_t count = 0;

for (p = s; *p != '\0'; ++p)

{

for (a = accept; *a != '\0'; ++a)

if (*p == *a)

break;

if (*a == '\0')

return count;

else

++count;

}

return count;

}从上面的示例代码中可以看出,strspn 函数从字符串参数 s 的开头计算连续的字符,而这些字符完全是 accept 所指字符串中的字符。简单地说,如果 strspn 函数返回的数值为 n,则代表字符串 s 开头连续有 n 个字符都属于字符串 accept 内的字符。

函数的调用示例如下面的代码所示:

返回一个整数值, 指定在string中全部由非characters中的字符组成的子串的长度. 如果string以一个包含在strcharset中的字符开头, 函数将返回0值.。查找任何一个不包含在strcharset串中的字符 (字符串结束符null除外) 在string串中首次出现的位置序号. 返回一个整数值, 指定在string中全部由characters中的字符组成的子串的长度. 如果string以一个不包含在strcharset中的字符开头, 函数将返回0值.。利用mid函数,返回文本串中从指定位置开始的特定数目的字符,该数目由用户指定。

I wel:5

Iwel:1

welcome:0

5:0

利用mid函数,返回文本串中从指定位置开始的特定数目的字符,该数目由用户指定。c提供fgetc和fputc函数对文本文件进行字符的读写,其函数的原型存于stdio.h头文件中,格式为:。将源串strsource开始的count个字符添加到目标串strdest后. 源串strsource的字符会覆盖目标串strdestination后面的结束符null. 如果count大于源串长度, 则会用源串的长度值替换count值. 得到的新串后面会自动加上null结束符. 与strcat函数一样, 本函数不能处理源串与目标串重叠的情况. 函数返回strdestination值.。

size_t strcspn(const char *s, const char *reject);

该函数的定义如下:

查找任何一个不包含在strcharset串中的字符 (字符串结束符null除外) 在string串中首次出现的位置序号. 返回一个整数值, 指定在string中全部由characters中的字符组成的子串的长度. 如果string以一个不包含在strcharset中的字符开头, 函数将返回0值.。scanf()函数的格式说明符如下所示:d 一十进制整数x-十六进制整数o-八进制整数u-无符号十进制数f-小数表示的浮点数e-指数表示的浮点数c-单个字符s-一字符串控制串中的一般字符表示匹配符,另外在%和格式说明符之间还可加修饰符,这些内容将在“文件和读写函数”一章中讲解(参数表)是由一个或多个参数构成,多个参数使用时用逗号分隔 c 语言常用的输入函数。vim使用通用的表达式(regular expressions)来进行逻辑查找.我们在以前讨论过用简单的字符串进行查找,但是这里我们将要看到的通用字符串查找要简单字符查找的功能强大得多.通过在我们的命令中使用通用表达式,我们可以查找任何一种字符类型,例如我们可以查找以t开头而以ing结尾的字尾串(通用表达式为\).然而这种强大的功能也是要付出一定的代价的.通用表达式是神秘的和简洁的.也许我们要花上很上的一段时间才会习惯这种查找方式,然后才能掌握这个强大的查找工具.。

函数的调用示例如下面的代码所示:

int main(void)

{

char str[] = "I welcome any ideas from readers, of course.";

printf("I wel:%d\n",strcspn(str,"I wel"));

printf("Iwel:%d\n",strcspn(str,"Iwel"));

printf("welcome:%d\n",strcspn(str,"welcome"));

printf("5:%d\n",strcspn(str,"5"));

return 0;

}在上面的示例代码中,因为 strcspn 函数返回的是以字符串 s 开头连续不包含字符串 accept 内的字符数目。c语言strchr函数可以查找n字符因此,其运行结果为:

I wel:0

Iwel:0

welcome:2

5:45

由此可见,对于 strspn 函数,如果找到了 reject 与 s 不相同元素时,指针停止移动,并返回以字符串 s 开头连续包含字符串 accept 内的字符数目;而 strncspn 函数则是找到了 reject 与 s 相同元素时,指针停止移动,并返回以字符串 s 开头连续不包含字符串 accept 内的字符数目。这一点一定要注意,千万不要混淆了。

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-98811-1.html

C语言用函数字符串的查找,字符串查找函数,C语言字符串查找函数详解相关推荐

  1. R语言rms包生存分析之限制性立方样条(RCS, Restricted cubic spline)分析详解实战:拟合连续性自变量和事件风险之间的关系:基于survival包lung数据

    R语言rms包生存分析之限制性立方样条(RCS, Restricted cubic spline)分析详解实战:拟合连续性自变量和事件风险之间的关系:基于survival包lung数据 目录

  2. c语言整数转ip地址字符串,C/C++ ip地址与int类型的转换实例详解

    C/C++ ip地址与int类型的转换实例详解 前言 最近看道一个面试题目,大体意思就是将ip地址,例如"192.168.1.116"转换成int类型,同时还能在转换回去 思路 i ...

  3. C语言指针面试题解析(万字超多题,每题都有详解)

    目录 零.前言 1.整型数组 2.字符数组 1.strlen函数 2.arr[]={'a','b','c'....}型 1.sizeof()计算 2.strlen()计算 3.char arr[]=& ...

  4. c语言常量的正确表示const,C语言中的const和free用法详解

    注意:C语言中的const和C++中的const是有区别的,而且在使用VS编译测试的时候.如果是C的话,请一定要建立一个后缀为C的文件,不要是CPP的文件.因为,两个编译器会有差别的. 一.C语言中的 ...

  5. go语言导入git包_使用go module导入本地包的方法教程详解

    go module 是Go1.11版本之后官方推出的版本管理工具,并且从 Go1.13 版本开始, go module 将是Go语言默认的依赖管理工具.到今天 Go1.14 版本推出之后 Go mod ...

  6. c语言stl模板,c/c++开发分享C++ 标准模板库 STL 顺序容器详解

    c++ 标准模板库 stl 顺序容器 容器 顺序性 重复性 支持迭代器 vector 动态数组 无序 可重复 随机访问迭代器 deque 双向队列 无序 可重复 随机访问迭代器 list 双向链表 无 ...

  7. mysql去重函数的使用方法_MySQL中使用去重distinct方法的示例详解

    一 distinct 含义:distinct用来查询不重复记录的条数,即distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而 ...

  8. c++ 虚函数多态、纯虚函数、虚函数表指针、虚基类表指针详解

    文章目录 静态多态.动态多态 虚函数 哪些函数类型不可以被定义成虚函数? 虚函数的访问方式 析构函数中的虚函数 虚函数表指针 vptr 多继承下的虚函数表 虚基类表指针 bptr 纯虚函数 抽象类 虚 ...

  9. C++虚函数、纯虚函数、虚析构、纯虚析构、动态绑定和抽象类详解。

    目录 1.虚函数的概念 2.虚函数的定义 3.虚函数的作用 4.用虚函数实现多态的方法 5.动态绑定和静态绑定 6.纯虚函数和抽象类 7.虚析构和纯虚析构 1.虚函数的概念 在C++程序中我们经常可以 ...

  10. m.pythontab.com_python字符串连接的三种方法及其效率、适用场景详解

    python3.x拼接字符串一般有以下几种方法: 1. 直接通过(+)操作符拼接s = 'Hello'+' '+'World'+'!' print(s) 输出结果:Hello World! 使用这种方 ...

最新文章

  1. ElasticSearch 学习笔记 - 10.指标聚合
  2. STM32 基础系列教程 40 - Lwip_mqtt
  3. jquery学习手记(5)对象
  4. 用RPython在云端运行可扩展数据科学
  5. 奥托尼克斯接近开关型号_12月23日NBA | 骑士VS老鹰、尼克斯VS奇才、开拓者VS鹈鹕...
  6. MysqlDataTruncation Mysql 数据插入错误
  7. 源码之ListView分析
  8. 业务专题篇:渠道流量分析
  9. JPA EntityManager详解
  10. 2019 年,Rust 与 WebAssembly 将让 Web 开发更美好
  11. 如何提高matlab的运算速度慢,如何提高MATLAB的运算速度
  12. 使用安全json parser防止json注入
  13. office 2016安装包
  14. npm下载axios
  15. 15款超实用学习APP安利
  16. 超级大反派降临:当黑客可以摧毁人造卫星
  17. 白话windows之四 异常处理机制(VEH、SEH、TopLevelEH...)
  18. [js高手之路]html5 canvas动画教程 - 跟着鼠标移动消失的一堆炫彩小球
  19. 如何下载ArcGis Server离线地图瓦片数据
  20. android AMS学习(一)

热门文章

  1. 二、半天时间掌握Dart开发语言-类的学习
  2. 2020年阿里实习生产品运营一面面经
  3. 学编程太枯燥?分享十几个边玩游戏边学编程的网站!第五个连孩子都在用
  4. [Android L]关于Android L的Service启动问题
  5. Typora设置标题自动添加序号
  6. Flutter开发——动画原理及核心类
  7. 短视频营销是什么?为什么现在这么火?
  8. 程序数据的集散地:数据库
  9. TOM邮箱|注册商务邮箱时起名有多重要
  10. 功能最完善,代码最简洁的选项卡代码(div+css)