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

strstr(str1,str2)函数使用时注意事项可能有的人还没听过strstr函数,个人认为这个一个很实用的函数,strstr(str1,str2)函数是字符串处理函数之一,位于头文件“string.h”中。对于处理字符串的一些问题有很大的帮助。定义:strstr(str1,str2)函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。定义说的有点羞涩难懂。举个例子就…

大家好,又见面了,我是你们的朋友全栈君。

可能有的人还没听过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;

        //提取出Mystr
        void 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字符串进行更改,若要更改,应该等使用完返回值后再更改!! 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152963.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 目标检测——SPPNet【含全网最全翻译】「建议收藏」

    目标检测——SPPNet【含全网最全翻译】「建议收藏」文章目录0.摘要1.简介2.基于空间金字塔池化的深度网络2.1卷积层和特征图2.2空间金字塔池化层2.3网络的训练2.3.1单一尺寸训练2.3.2多尺寸训练3.用于图像分类的SPP-NET3.1ImageNet2012分类实验3.1.1基准网络架构3.1.2多层次池化提升准确度3.1.3多尺寸训练提升准确度3.1.4全图像表示提升准确度3.1.5特征图上的多视图测试…

  • 单链表排序java_快速排序链表

    单链表排序java_快速排序链表难易程度:★★重要性:★★★链表的排序相对数组的排序更为复杂些,也是考察求职者是否真正理解了排序算法(而不是“死记硬背”) 链表的插入排序 publicclassLinkedInsertSort{staticclassListNode{intval;ListNodenext;Lis…

    2022年10月10日
  • goland2021 激活(已测有效)

    goland2021 激活(已测有效),https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • 世界各个地区WIFI 2.4G及5G信道划分表(附无线通信频率分配表)

    目前主流的无线WIFI网络设备802.11a/b/g/n/ac:传统802.111997年发布两个原始数据率:1Mbps和2Mbps跳频展频(FHSS)或直接序列展布频谱(DSSS)三个不重叠的信道中,工业、科学、医学(ISM)频段频率为2.4GHz最初定义的载波侦听多点接入/避免冲撞(CSMA-CA)802.11a1999年发布提供多种调制类型的数据传输率:6、9、12、18、24…

  • 解决idea中maven项目的pom文件不会自动下载jar包问题 + 更新不完整依赖命令

    解决idea中maven项目的pom文件不会自动下载jar包问题 + 更新不完整依赖命令不会自动下载jar包idea昨天还在正常使用,结果今天发现pom文件中的依赖不会自动下载了,最后百度找到了解决方案: setting——>maven——>去掉workoffline的勾,问题解决!但是我之前用着还是没有这个问题的,百度发现可能是Intellijideasetting显示出错/或者电脑运行过久出错,在经历几次重启I…

  • Apache Struts2再爆高危漏洞

    Apache Struts2再爆高危漏洞60网站安全检测最新struts2命令执行漏洞分析时间:2013-07-1809:46 在struts2中,DefaultActionMapper类支持以”action:”、”redirect:”、”redirectAction:”作为导航或是重定向前缀,但是这些前缀后面同时可以跟OGNL表达式,由于struts2没有对这些前缀做过滤,

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号