? ? ? ? 在上篇我們了解了部分字符函數及字符串函數,下面我們來看剩下的字符串函數.
strstr 的使用和模擬實現
? ? ? ? 老規矩,我們先了解一下strstr這個函數,下面看下這個函數的函數原型.
char * strstr ( const char * str1, const char * str2);
? ? ? ? 如果沒找到就返回NULL指針.
? ? ? ? 下面我們看下它的使用.
#include <string.h>
int main()
{char arr[20] = "hello bit bit abc";char* p = strstr(arr, "bit");printf("%s\n", p);p = strstr(arr, "ab");printf("%s\n", p);return 0;
}
????????代碼執行結果如下
?
? ? ? ? 在了解了他的功能之后我們嘗試著實現一下這個函數.(我們先用暴力算法去實現,如果對kmp算法感興趣的話可以看下????????????????博客).
char* strstr(const char* str1, const char* str2)
{if (!str1 || !str2){return NULL;}//str1或str2為空返回空char* p1 = str1;char* p2 = str2;char* cur = str1;while (*cur){while (*p1 == *p2){if (*p1 == '\0'){return cur;//找的字符串與原字符串相同}p1++;p2++;}if ((*p2) == '\0'){return cur;//找到字符串了,且二者不完全相同}p1 = ++cur;p2 = str2;}return NULL;//沒找到
}
int main()
{char arr[20] = "hello bit bit abc";char* p = strstr(arr, "bit");printf("%s\n", p);p = strstr(arr, "ab");printf("%s\n", p);char arr1[20] = "hello";p = strstr(arr1, "hello");printf("%s\n", p);return 0;
}
? ? ? ? 在寫函數時一定要將各種情況考慮清楚.?
strtok 函數的使用
? ? ? ? 還是先看函數原型
char * strtok ( char * str, const char * sep);
? ? ? ? ?這個函數通常用于分割一段字符串.?下面看下函數使用:
#include<string.h>
int main()
{char p[100] = "/Users/Adolbook/Documents/WeChat%20Files/wxid";;char* str = NULL;char* d = "/";for (str = strtok(p, d); str != NULL; str = strtok(NULL, d)){printf("%s\n", str);}return 0;
}
strerror 函數的使用
? ? ? ? 函數原型:
char * strerror ( int errnum );
????????strerror函數可以把參數部分錯誤碼對應的錯誤信息的字符串地址返回來。
????????在不同的系統和C語?標準庫的實現中都規定了?些錯誤碼,?般是放在 errno.h 這個頭?件中說明 的,C語?程序啟動的時候就會使??個全?的變量errno來記錄程序的當前錯誤碼,只不過程序啟動 的時候errno是0,表?沒有錯誤,當我們在使?標準庫中的函數的時候發?了某種錯誤,就會講對應 的錯誤碼,存放在errno中,??個錯誤碼的數字是整數很難理解是什么意思,所以每?個錯誤碼都是 有對應的錯誤信息的。strerror函數就可以將錯誤對應的錯誤信息字符串的地址返回。?
? ? ? ? 我們通過下面的代碼先簡單的認識一下錯誤信息
#include <errno.h>
#include <string.h>
int main()
{int i = 0;for (i = 0; i <= 10; i++) {printf("%s\n", strerror(i));}return 0;
}
? ? ? ? 輸出結果見下:?
? ? ? ? 下面來看一下使用的舉例
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main ()
{FILE * pFile;pFile = fopen ("unexist.ent","r");if (pFile == NULL)printf ("Error opening file unexist.ent: %s\n", strerror(errno));return 0;
}
?
? ? ? ? 好啦,今天的復習就進行到這里.大家晚安~?