strstr(str1,str2)函数使用时注意事项
来源:互联网 发布:淘宝店铺怎么关注链接 编辑:程序博客网 时间:2024/05/17 14:25
可能有的人还没听过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; //提取出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字符串进行更改,若要更改,应该等使用完返回值后再更改!!
可能有的网友会遇到这样的问题,可以以此为前车之鉴!
- strstr(str1,str2)函数使用时注意事项
- locate(str1,str2)函数
- 算法21:实现strstr(str1, str2)
- strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
- strstr(char *str1, const char *str2)的应用
- strcmp(str1,str2)函数用法
- stract函数的实现 连接str2到str1的后面
- 字符串操作函数strcpy(str1, str2)的效果
- CONCAT_WS('-',str1,str2)函数,用'-'将两个字段拼起来
- MySQL的自定义排序函数 FIELD(str,str1,str2,str3,...)
- memcpy(str2,str1,i);
- 复制str1到str2
- strcpy(str1,str2);
- 字符串比较函数strncasecmp():比较字符串的前n个字符|字符串查找函数strstr和string.find() 查找字符串str1中是否存在与str2一样的子字符串
- str1==str2和str1.equals(str2)的问题
- if (Object.ReferenceEquals(str1,str2))
- 编程序将一个字符串的前N个子字符送到一个字符型数组中去,然后再加上一个'\0'(不允许使用strcoy(str1,str2,n)函数)。
- 有两个字符串str1和str2,写一个函数实现在str1中查找str2的初始位置。要求不区分大小写。
- 217. Contains Duplicate
- C++覆盖(虚函数的实现原理)
- 练习Linux中的vi编辑器
- Android入门第十二篇之Gallery
- 简单DP 总结
- strstr(str1,str2)函数使用时注意事项
- 前端常用的正则表达式大全
- orcale 11G 闪回查询误删数据
- Swift2.3 --> Swift3.0 的变化
- 题目1434:今年暑假不AC[贪心算法]
- iOS应用安全读书笔记之重要的属性文件
- 【软考】-算法- 快速排序
- 大数据hadoop 面试经典题
- MySQL数据库TDSQL架构分析及采用策略扩容流程