对数组使用strstr时的主意事项

文章讨论了C语言中strstr函数在处理非字符串数组时可能引发的问题。由于strstr函数依赖于终止符来确定字符串边界,当它用于查找数组中的子序列时,可能会超出数组边界,导致未定义行为。为避免这种问题,需确保在数组末尾添加终止符,或者只对真正的字符串使用strstr。
摘要由CSDN通过智能技术生成

string.h中的这个strstr()函数用来在a字符串中查找b字符串,并且可以返回找到相符字符串所在的位置,不仅好用,而且标准库一般比自己写for循环查找的速度要快很多(毕竟有些标准库函数的实现不仅巧妙,而且都是用汇编实现的)。

但是在实际使用时要注意,如果引入的2个指针确实指向的是字符串,没什么问题,但是如果引入的2个指针指向的是数组,那就有问题了。

strstr函数因为没有参数制定要找和被找的字符(或者缓冲区)的长度,所以要找的和被找的范围都是以\0为截止的。字符串在内存中结尾都有个\0来作为字符串结尾的标记。但是数组不会有统一的为\0的结尾,数组最后一字节数据是什么那么数组的结尾就是什么。

那么问题来了,如果引入的指针指向的是数组,会发生什么?

看下面代码

#include <stdio.h>
#include <string.h>
#include <stdint.h>

uint8_t a[] = "123456";
uint8_t b[] = "34";
uint8_t d[] = "78";
uint8_t *c;

int main()
{
   c = strstr(a,b);
   printf("%s",c);
   
   return 0;
}

在123456中查找34,运行结果以字符串打印是3456

3456

如果引入的指针是指向数组的

#include <stdio.h>
#include <string.h>
#include <stdint.h>

uint8_t a[] = {0x31,0x32,0x33,0x34,0x35,0x36};
uint8_t b[] = {0x33,0x34};
uint8_t d[] = {0x37,0x38};
uint8_t *c;

int main()
{
   c = strstr(a,b);
   printf("%s",c);
   
   return 0;
}

执行结果打印出3478

3478

这里strstr的实际执行效果是 在数组a+b+d中找b+d,因为数组a b d在内存中大概率是连在一起的,所以strstr从数组a开始的指针往下找,找到\0(其实就是0)的时候其实查找范围已经超出了abd所在的内存范围,如果运气差点儿,abd数组后面连续很长的一段内存里一个0都没有,那么你的这个strstr就会运行很长时间,直到世界的尽头。

要想让程序正确运行,就需要手动给数组末尾组加上0,告诉strstr“字符串”已经结束了

#include <stdio.h>
#include <string.h>
#include <stdint.h>

uint8_t a[] = {0x31,0x32,0x33,0x34,0x35,0x36,0x00};
uint8_t b[] = {0x33,0x34,0x00};
uint8_t d[] = {0x37,0x38};
uint8_t *c;

int main()
{
   c = strstr(a,b);
   printf("%s",c);
   
   return 0;
}

这样输出的就是3456了

3456

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值