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


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

定义说的有点羞涩难懂。举个例子就知道了。 
比如: 
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. linux应用参数 冒号,Lua-面向对象中函数使用时冒号(:)和点(.)的区别

    Lua-面向对象中函数使用时冒号(:)和点(.)的区别,我们先来看一段简单的代码: local Animal ={}functionAnimal:Eat( food )print("Anim ...

  3. 关于ADAMS中AZ函数使用时的一些心得

    今天做仿真时,发现使用AZ函数时的一些注意事项: 一:          其中MARKER_1需要是作用part(或者说受力运动的那个part)上的点,MARKER_33是与作用part相连的那个pa ...

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

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

  5. memmove函数使用时注意的问题

    首先,来了解一下memmove函数的声明类型,Linux c中的定义如下: #include <string.h> void *memmove(void *dest, const void ...

  6. Matlab imshow(f,G)函数使用时出现错误

    imshow(f,G)使用时出现错误 ① imshow(h,128) 错误使用 imshow>preParseInputs (line 467) IMSHOW 语法无效. 出错 imshow ( ...

  7. select函数使用时应注意的问题

    问题一:fd_set和timeval的重置. select函数的使用一般分为以下几步 1.FD_ZERO(fd_set*); 2.FD_SET(int fd,fd_set*); 3.int selec ...

  8. php crc32 作用,php的crc32函数使用时需要注意的问题(不然就是坑)

    前几天写了一个分表程序,用的hash算法是crc32.分表的函数如下: 复制代码 代码如下: function _getHash($username) { $hash = crc32($usernam ...

  9. 一个memset函数使用时的坑

    平时使用memset函数都是用来初始化字符串,从来没有注意过它具体是怎么实现的,最近无意中发现原来这个函数里面还是有坑的. 我尝试用它来初始化整型数组 int array[10]; memset(ar ...

最新文章

  1. live555学习笔记2-基础类
  2. 免费下载!200+讲者核心观点公布!2021最强AI学术会议视频全部回放
  3. 关于C#中Queue的线程安全问题
  4. 网络获取json数据并解析
  5. vim 块操作、多文件操作、多窗口操作命令
  6. auto与迭代器的用法_C++ STL move_iterator移动迭代器用法详解
  7. jzoj4672-Graph Coloring【图论,模拟】
  8. Python学习札记(十七) 高级特性3 列表生成式
  9. SQLite:在Julia中判断一个表是否存在数据库中?
  10. 【人人都是极客】精选文章汇总
  11. 计算机一级office题库百度云,历年全国计算机等级考试一级MSOffice真题
  12. 跳马问题:马走日,请问马从0,0位置出发,走到x,y目标点,还必须走k步,有多少种走法
  13. 普通电脑用u盘安装服务器系统安装教程,Windows Server 2016使用U盘安装需要哪些步骤 硬盘安装Windows Server 2016图文教程...
  14. 《从0到1》读书笔记第2章像1999 年那样狂欢第1记:小结及词汇解析
  15. CDN基础知识-CNAME、加速域名、源站地址与回源host之间的关系
  16. 安卓miracast花屏_计算机通过Miracast无线投屏到其他设备,出现卡顿及花屏现象...
  17. 《和平精英》新模式,玩法竟跟《使命召唤》和《王牌战士》类似?
  18. ThinkPad F1按键常亮且喇叭无声音
  19. U盘重装系统-非常简单制作方法
  20. MFC 类层次结构图

热门文章

  1. 你心存幻想的样子,真的很傻
  2. IntelliJ Idea SpringBoot 数据库增删改查实例
  3. C++STL的发展历程
  4. 服务器中调试微信支付免预充,微信支付-统一支付接口被坑经历
  5. STM32F103ZET6中文数据手册
  6. Vue3学习笔记:了解并使用Pinia状态管理
  7. 《Alogrithms》算法学习笔记——第一章:导语与数论
  8. 【论文翻译】Clustering by Passing Messages Between Data Points
  9. JS中的arguements到底是个啥?
  10. SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed