可能有的人还没听过strstr函数,个人认为这个一个很实用的函数,strstr(str1,str2) 函数是字符串处理函数之一,位于头文件 “string.h”中。对于处理字符串的一些问题有很大的帮助。


定义:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。

源于百度百科:

http://baike.baidu.com/link?url=ya28ba45_Sr6cFdJfNiQdHXl2jpZ_miXq-XnVOZurxXP_BEAck-q6ut3gX7X-cVe15lfkAWCv8z2dZQTi28VBa

定义说的有点羞涩难懂。举个例子就知道了。 
比如: 
char str2 = “cdef”; 
char str1 = “abcdefgh”; 
则通过函数,将返回 
strstr(str1,str2) = cdefgh;

如果str1不包含有str2。 
char str2 = “cxef”; 
char str1 = “abcdefgh”; 
则通过函数,将返回 
strstr(str1,str2) = NULL;


该函数在比较字符串和对字符串的截取上有很大的帮助。但在某次使用过程中,程序出现了无法预料的错误。通过分析并打印显示出strstr的返回值,才发现问题出在该函数上。 
情况描述: 
函数功能是,判断出数组字符串里的Uart2_Buf 含有“START”字符串的情况下,将截取其返回值给Mystr。然后把Uart2_Buf 内容清空,并打印出Mystr。

        char Uart2_Buf[11] = "abSTARTdend;char Mystr1[20] = {0};char *Mystr=Mystr1;//提取出Mystrvoid test_strstr(){if(strstr(Uart2_Buf , "START") != NULL){Mystr = strstr(Uart2_Buf , "START");//返回START即之后的值CLR_Buf2();//把Uart2_Buf 内容清空printf("Mystr=%s ",Mystr);}}//清空Uart2_Buf void CLR_Buf2(void){u16 k;for(k=0;k<11;k++)      {Uart2_Buf[k] = 0X00;}}

结果: 
上位机打印出显示:Mystr= 
Mystr为空,没有任何东西。

通过调试,去掉函数里CLR_Buf2(); 不对Uart2_Buf 进行清空,再打印显示:Mystr=STARTdend

这样就能确定错误的结果跟清空Uart2_Buf 有关了,辣么,如果不是清空Uart2_Buf ,而是给Uart2_Buf 赋值呢? 
更改函数:void CLR_Buf2(void)

        //Uart2_Buf 赋值'a'void CLR_Buf2(void){u16 k;for(k=0;k<11;k++)      {Uart2_Buf[k] = 'a';}}

结果: 
上位机打印出显示:Mystr=aaaaaaaaa(9个a) 
居然显示的是Uart2_Buf 的后部分(Uart2_Buf长度为20),按正常应该显示的是9个字符“STARTdend“才对。

通过其他测试,只要在对Mystr显示之前,更改了Uart2_Buf的内容,那么显示结果就会错误,而且Mystr显示的是Uart2_Buf更改的后部分的值。 
因此可以推断出,Mystr的显示和Uart2_Buf 地址有关,或者Mystr显示跟相关指针有关


那么一定是对该函数的使用方法用错了,或者还没完全理解其定义。再回到这个函数定义,仔细阅读这句: 
定义:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。


瞬间明白了原先觉得羞涩难懂的定义,原来strstr(str1,str2)返回的是str2在str1中首次出现的地址,也就是说,strstr(str1,str2)返回值能随str1变化而变化,因为他们内容有共用地址,地址一样,输出的内容也一样。


结论(注意事项):

因而,在使用或者处理strstr(str1,str2)返回值之前,切记不要对str1字符串进行更改,若要更改,应该等使用完返回值后再更改!!

strstr(str1,str2) 函数相关推荐

  1. strstr(str1,str2)函数使用时注意事项

    可能有的人还没听过strstr函数,个人认为这个一个很实用的函数,strstr(str1,str2) 函数是字符串处理函数之一,位于头文件 "string.h"中.对于处理字符串的 ...

  2. concat函数java_MySql中CONCAT(str1,str2,...)函数

    一.CONCAT(str1,str2,...) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL mysql> select concat('11','22', ...

  3. Strstr和Strchr函数详解

    Strstr函数详解 Strstr函数原型 char *strstr( const char *string, const char *strCharSet ); Strstr函数功能 在一个字符串中 ...

  4. C语言学习笔记---字符串查找函数strstr()和strpbrk()函数

    strstr()函数   C语言中如何向查找一个字符串中是否包含另一个字符串,可以使用strstr()函数.使用示例如下: int main(int argc, char *argv[]) {char ...

  5. C语言字符串函数(3)strstr,strtok函数的详解

    上一期,我讲解了关于字符串函数中,受限制的字符串函数,有想了解的小伙伴们可以点此链接去看看:C语言字符串函数(2)受限制的字符串函数 那么今天,我来讲一讲标题中这两个函数的作用和使用方法. 目录 一. ...

  6. 【C】模拟实现strlen,strcpy,strcat,strcmp,strncpy,syrcat,strnact,strncmp,strstr等字符串函数

    目录 字符串函数模拟实现 1.strlen模拟实现 2.strcpy模拟实现 3.strncpy模拟实现 4.strcat模拟实现 5.strncat模拟实现 6.strcmp模拟实现 7.strnc ...

  7. strstr()函数的使用说明(C语言)

    头文件 <string.h> 函数作用: 1.strstr() 函数搜索一个字符串在另一个字符串中的第一次出现. 2.找到所搜索的字符串,则该函数返回第一次匹配的字符串的地址: 3.如果未 ...

  8. strlen strstr strtok strerror 函数解析及模拟实现

    文章目录 一.strlen 求字符串长度 1.函数介绍 2.模拟实现(三种方式) 二.strstr 字符串查找 1.函数介绍 2.模拟实现 三.strtok 字符串分割 四.strerror perr ...

  9. strstr和memcmp函数的实现

    #include <stdio.h> #include <stdlib.h> //malloc()函数 typedef unsigned int size_t;size_t m ...

最新文章

  1. three相机在模型上_基于 three.js 的 3D 粒子动效实现
  2. IP核引发的关于定,浮点数的认识
  3. matplotlib.pyplot_Matplotlib Pyplot教程
  4. 两点坐标间距离的算法以及验证【转】
  5. 创建新的option
  6. 28 | 堆和堆排序:为什么说堆排序没有快速排序快?
  7. 腾讯游戏:元旦假期未成年人游戏限玩1小时/日
  8. 车和家李想批国内电动车虚假里程宣传:特斯拉都打到家门口了别自嗨了
  9. Centos8 加密 GRUB 防破解root密码
  10. C++获取当前时间及计算当前时间距某个时间点的时间段
  11. 80X86寄存器介绍
  12. 【HarmonyOS】【Json解析】ZSON 与 HiJson 使用
  13. 计算机视觉教程章毓晋课后答案6,计算机视觉教程 教学课件 章毓晋 CCV01.pdf
  14. 乡镇特色产业发展情况调研报告
  15. mysql my.cnf位置_我如何找到MySQL my.cnf位置
  16. 云科技时代,微软纳德拉与小米雷军为什么走到一起?
  17. word中公式全篇一次性转math type公式方法,而且出现omml2mml.xsl 问题的解决方法(有效!!!)
  18. 什么是固定资产管理系统?用固定资产管理系统管理固定资产的好处?
  19. 计算机科学第三讲——布尔逻辑和逻辑门
  20. 给初学者推荐的10个Python免费学习网站,赶紧收藏吧

热门文章

  1. viewFlipper的基本实现
  2. 智慧工地-未来工地新形态
  3. Hive 数据倾斜问题定位排查及解决(实际案例)
  4. 成功解决:ping不通腾讯云服务器问题
  5. Python操作Excel文件:插入一列数据
  6. 如果机器可以深度学习,人类的学习有何意义
  7. 如何证明二元函数的连续性 可…
  8. 调音台使用基础-增益结构与推子位置
  9. folly库安装(5)folly的安装
  10. Open Graph 分享预览