簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM