为什么strstr
函数总是对以下代码返回true:
void main(){
char* a = "qweqweqweqweqweqw";
char b[5] = {0x00,0xff,0xaa,0xbb,0xcc};
printf("%p",strstr(a,b));
}
当我将空字符串0x00
替换为其他内容时,错误消失了。
请帮我理解原因?
答案 0 :(得分:4)
来自strstr
:
char *strstr(const char *haystack, const char *needle);
strstr()
函数找到第一次出现的子字符串 在干草堆中的针。
由于字符串在C中以空值终止,0x00
表示空字节,因此b
实际上是""
。
搜索空字符串始终会产生true,因此您的程序将始终找到子字符串。
strstr
专为字符串而设计。没有字符串包含0x00
作为字符,因此strstr
在此不起作用。您需要编写自定义搜索功能,如binbin
,它会在二进制数据中搜索二进制数据。函数签名可能是这样的:
unsigned char* binbin(const unsigned char* haystack, size_t haystack_len,
const unsigned char* needle, size_t needle_len);
此处传递大小,因为我们无法空终止数据。
答案 1 :(得分:2)
通过将0x00
放在字符串b
的开头,您基本上创建了一个空字符串,因为它在第一个char中终止。您看到0x00
或'\0'
是一个字符串终止符,表示所有c字符串函数的字符串结尾。所以strstr()
只读取第一个字符串,假设字符串在那里结束,并且由于之前没有任何内容,假设字符串是空字符串,并且空字符串是每个字符串的一部分。< / p>
答案 2 :(得分:1)
许多平台都有memmem功能:
void main(){
char* a = "qweqweqweqweqweqw";
char b[5] = {0x00,0xff,0xaa,0xbb,0xcc};
printf("%p", memmem(a,strlen(a), b, sizeof(b)));
}