为什么strstr()搜索空字符串总是返回true?

时间:2015-12-04 12:35:16

标签: c

为什么strstr函数总是对以下代码返回true:

void main(){
    char* a = "qweqweqweqweqweqw";
    char b[5] = {0x00,0xff,0xaa,0xbb,0xcc};
    printf("%p",strstr(a,b));
}

当我将空字符串0x00替换为其他内容时,错误消失了。 请帮我理解原因?

3 个答案:

答案 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)));
}