strstr(str1,str2) 函数
可能有的人还没听过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) 函数相关推荐
- strstr(str1,str2)函数使用时注意事项
可能有的人还没听过strstr函数,个人认为这个一个很实用的函数,strstr(str1,str2) 函数是字符串处理函数之一,位于头文件 "string.h"中.对于处理字符串的 ...
- concat函数java_MySql中CONCAT(str1,str2,...)函数
一.CONCAT(str1,str2,...) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL mysql> select concat('11','22', ...
- Strstr和Strchr函数详解
Strstr函数详解 Strstr函数原型 char *strstr( const char *string, const char *strCharSet ); Strstr函数功能 在一个字符串中 ...
- C语言学习笔记---字符串查找函数strstr()和strpbrk()函数
strstr()函数 C语言中如何向查找一个字符串中是否包含另一个字符串,可以使用strstr()函数.使用示例如下: int main(int argc, char *argv[]) {char ...
- C语言字符串函数(3)strstr,strtok函数的详解
上一期,我讲解了关于字符串函数中,受限制的字符串函数,有想了解的小伙伴们可以点此链接去看看:C语言字符串函数(2)受限制的字符串函数 那么今天,我来讲一讲标题中这两个函数的作用和使用方法. 目录 一. ...
- 【C】模拟实现strlen,strcpy,strcat,strcmp,strncpy,syrcat,strnact,strncmp,strstr等字符串函数
目录 字符串函数模拟实现 1.strlen模拟实现 2.strcpy模拟实现 3.strncpy模拟实现 4.strcat模拟实现 5.strncat模拟实现 6.strcmp模拟实现 7.strnc ...
- strstr()函数的使用说明(C语言)
头文件 <string.h> 函数作用: 1.strstr() 函数搜索一个字符串在另一个字符串中的第一次出现. 2.找到所搜索的字符串,则该函数返回第一次匹配的字符串的地址: 3.如果未 ...
- strlen strstr strtok strerror 函数解析及模拟实现
文章目录 一.strlen 求字符串长度 1.函数介绍 2.模拟实现(三种方式) 二.strstr 字符串查找 1.函数介绍 2.模拟实现 三.strtok 字符串分割 四.strerror perr ...
- strstr和memcmp函数的实现
#include <stdio.h> #include <stdlib.h> //malloc()函数 typedef unsigned int size_t;size_t m ...
最新文章
- three相机在模型上_基于 three.js 的 3D 粒子动效实现
- IP核引发的关于定,浮点数的认识
- matplotlib.pyplot_Matplotlib Pyplot教程
- 两点坐标间距离的算法以及验证【转】
- 创建新的option
- 28 | 堆和堆排序:为什么说堆排序没有快速排序快?
- 腾讯游戏:元旦假期未成年人游戏限玩1小时/日
- 车和家李想批国内电动车虚假里程宣传:特斯拉都打到家门口了别自嗨了
- Centos8 加密 GRUB 防破解root密码
- C++获取当前时间及计算当前时间距某个时间点的时间段
- 80X86寄存器介绍
- 【HarmonyOS】【Json解析】ZSON 与 HiJson 使用
- 计算机视觉教程章毓晋课后答案6,计算机视觉教程 教学课件 章毓晋 CCV01.pdf
- 乡镇特色产业发展情况调研报告
- mysql my.cnf位置_我如何找到MySQL my.cnf位置
- 云科技时代,微软纳德拉与小米雷军为什么走到一起?
- word中公式全篇一次性转math type公式方法,而且出现omml2mml.xsl 问题的解决方法(有效!!!)
- 什么是固定资产管理系统?用固定资产管理系统管理固定资产的好处?
- 计算机科学第三讲——布尔逻辑和逻辑门
- 给初学者推荐的10个Python免费学习网站,赶紧收藏吧