C語言之strstr函數的模擬實現
文章目錄
- C語言之strstr函數的模擬實現
- 1. strstr函數的介紹
- 2. strstr函數的使用
- 3. strstr的模擬實現
- 3.1 實現思路
- 3.2 實現代碼
1. strstr函數的介紹
函數聲明如下:
char * strstr ( const char * str1, const char * str2 );
strstr函數是用于在字符串str1中找str2字符串第一次出現的位置,如果找到改位置,則將這個位置返回,找不到則返回一個空指針NULL
strstr函數比較元素時,不包含 \0,以 \0 作為結束的標志
2. strstr函數的使用
#include <stdio.h>
#include <string.h>int main()
{char arr1[] = "abcadefdef";char arr2[] = "def";char * ret = strstr(arr1, arr2);if (ret != NULL){printf("%s\n", ret);}else{printf("找不到\n");}return 0;
}
如果arr1字符串中是否有arr2 def 這三個字符,必須得是連續的
然后用ret來接收strstr函數的返回值
如果arr1中有出現arr2這個字符串,則返回第一次出現的地址
否則則返回一個空指針
最后繼續判斷是否為空指針,如果不是則打印第一次出現的位置
運行結果如下:
3. strstr的模擬實現
3.1 實現思路
假設有兩個字符數組
str1中的字符串為 a b b b c d e f \0
str2中的字符串為 b b c \0
當將這兩個字符串傳給strstr函數時,傳入的是首元素地址,所以str1指向字符 a ,str2指向字符 b
-
要判斷str1字符串中是否有str2字符串,首先,str1要從第一個元素開始比較,如果從第一個元素就錯了,所以要通過指針偏移的方式來找到第二個元素,如果兩個元素相同,那么str1 和 str2 都偏移一個字節找到下一對要比較的元素
-
當指針偏移到第二個元素的時候,當第二遍比較的時候,str1 和 str2 前兩個字符都相同,此時str1指向第三個元素 b ,str2指向第二個元素 b ,然后str1 和 str2 都偏移一個字節找到下一個元素, str1 找到第四個元素 b,str2 找到第三個元素 c,此時兩個元素不相同,str1 得回到比較時的位置,str2 得回到起始位置
3.所以我們可以定義兩個指針變量用來記錄str1比較時的位置,和str2的起始位置,假設為s1 和 s2
通過比較s1 和 s2 的元素,判斷是否相符合,如果不符合s1 回到 str1的位置, s2回到 str2 的位置
然后str1++找到下一個元素,從這個元素開始比較,當s2指向\0的時候,則返回str1的地址,我們也可以定義一個cur來存放str1的地址,這樣比較清晰一點
3.2 實現代碼
#include <stdio.h>
#include <string.h>
#include <assert.h>char* my_strstr(const char* str1, const char* str2)
{const char* cur = str1; //用cur用來記錄當前的位置const char* s1 = NULL; //通過s1 和 s2 比較元素const char* s2 = NULL;assert(str1 && str2); //assert斷言,如果傳入的地址有有一個會空指針,則直接返回str1的地址if (str2 == '\0')return (char*)str1;while (*cur) //當cur中的值不為'\0'時,進入循環{s1 = cur; //s1回到比較時的位置s2 = str2; //s2回到初始位置while (*s1 == *s2) //當s1和s2指向的值相等時,進入循環{s1++; //找到下一個元素s2++; //找到下一個元素//再次比較}if (*s2 == '\0') //當s2中的元素為'\0'時,則說明在str1中找到了str2return (char*)cur; //返回當前的位置cur++; //第一次沒找到,找到下一個元素重新尋找}return NULL; //如果在循環中沒有找到,則返回一個空指針
}int main()
{char arr1[] = "abcadefdef";char arr2[] = "def";char* ret = my_strstr(arr1, arr2);if (ret != NULL){printf("%s\n", ret);}else{printf("找不到\n");}return 0;
}
運行結果如下: