最近在寫一段C語言代碼時用到了strstr()函數,遇到了一個意想不到的問題,記錄一下。
這個函數接收兩個參數,strstr(str1,str2)函數具體功能是檢測str2是否爲str1的子集,如果是則返回str1首次出現的地址,否則返回NULL。
一開始調用這個函數的時候沒想太多,直接使用後發現有些情況下儘管str2是str1的子集,函數返回值也是NULL。經過排查後發現如果在傳入參數str1的數組中包含str2,但是在str2出現前有值爲0x00 或 ‘\0’的數組元素,函數就會返回NULL。根據這一現象,盲猜這是此函數的執行結束機制,即當函數檢測到str1中出現0x00或’\0’時,立即return。
下面用程序驗證一下:
int main()
{
char str1[6]={'a','b','c','d','e'};
char str2[]="cd";
char *n;
n=strstr(str1,str2); //將函數返回值賦值給n
printf("&str1:%d\n",str1); //打印str1數組首地址
printf("&str2:%d\n",str2);
printf(" n:%d\n",n); //打印n的值
system("pause");
return 0;
}
執行結果:
可以看出n的值爲6356744,比str1首地址大2,也就是str2首次出現的地址。
這個時候將str1[0]改爲0x00或’\0’,運行結果如下:
這個時候n的值爲0,說明strstr()函數執行到str1[0]時就return 0。