[英]Why strstr() search for null string always return true?
為什么strstr
函數總是對以下代碼返回true:
void main(){
char* a = "qweqweqweqweqweqw";
char b[5] = {0x00,0xff,0xaa,0xbb,0xcc};
printf("%p",strstr(a,b));
}
當我將空字符串0x00
替換為其他內容時,錯誤消失了。 請幫我理解為什么?
從strstr
:
char *strstr(const char *haystack, const char *needle);
strstr()
函數在字符串haystack中查找第一次出現的子串針。
由於字符串在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);
這里傳遞一個大小,因為我們不能空終止數據。
通過將0x00
放在字符串b
的開頭,您基本上創建了一個空字符串,因為它在第一個字符串中終止。 你看到0x00
或'\\0'
是一個字符串終止符,表示所有c字符串函數的字符串結尾。 所以strstr()
只讀取第一個char,假設字符串在那里結束,並且由於之前沒有任何內容,假設字符串是空字符串,並且空字符串是每個字符串的一部分。
許多平台都有memmem功能:
void main(){
char* a = "qweqweqweqweqweqw";
char b[5] = {0x00,0xff,0xaa,0xbb,0xcc};
printf("%p", memmem(a,strlen(a), b, sizeof(b)));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.