赶紧来修炼内功~字符串函数详解大全(三)
目錄
1. strstr
2. strtok
重點:?
?3. strerror
perror:
1. strstr
該函數是用來查找str1字符串中是否含有str2字符串
? ?存在:返回str2字符串所在的起始地址
不存在:返回NULL
int main() {char str1[] = "abcdefabc";char str2[] = "fab";char* p = strstr(str1, str2); //strstr函數的返回值為char*類型,所以創建一個char*類型的p來 //接收地址printf("%s\n", p);return 0; }?如果str1字符串中含有多個str2字符串,那么返回第一次找到的str2的地址
int main() {char str1[] = "cdefabcfabfabdef";//含有多個"fab"字符串char str2[] = "fab";char* p = strstr(str1, str2);printf("%s\n", p);return 0; }?找不到就是不存在,返回NULL
int main() {char str1[] = "cdefadbc";char str2[] = "fab";char* p = strstr(str1, str2);if (p == NULL)printf("不存在\n");elseprintf("%s\n", p);return 0; }模擬實現:
?創建一個my_strstr函數,模擬實現strstr函數的功能:
char* my_strstr(const char* str1, const char* str2) { //通過4指針法實現assert(str1 && str2);char* s1 = str1;char* s2 = str2;while (*s1++ != '\0'){while (*s1 != *s2 && *s1 != '\0')s1++;str1 = s1;while (*s1 == *s2){s1++;s2++;}if (*s2 == '\0')return str1;s1 = str1;s2 = str2;}return NULL; } int main() {char arr1[] = "abcdefabcab";char arr2[] = "fabc";char* p = my_strstr(arr1, arr2);if (p == NULL)printf("不存在\n");elseprintf("%s\n", p);return 0; }2. strtok
該函數的返回類型為char*類型,
delimiters參數是個字符串,定義了用作分隔符的字符集合,
第一個參數指定一個字符串,它包含了0個或者多個由delimiters字符串中一個或者多個分隔符分割的標記。
該函數的作用是:將str所指向的字符串按分隔符分割成若干段字符串。
重點:?
1. strtok函數找到str中的下一個標記,并將其用 '\0' 結尾,返回一個指向這個標記起始位置的指針。(注: strtok函數會改變被操作的字符串,所以在使用strtok函數切分的字符串一般都是臨時拷貝的內容 并且可修改。)
2. strtok函數的第一個參數不為 NULL ,函數將找到str中第一個標記,strtok函數將保存它在字符串中的位置。
3. strtok函數的第一個參數為 NULL ,函數將在同一個字符串中被保存的位置開始,查找下一個標記。
4. 如果字符串中不存在更多的標記,則返回 NULL 指針。
int main() {char* p = "shandongkejidaxue@985.com";const char* del = ".@";char arr[30];strcpy(arr, p);//將數據拷貝一份,處理arr數組的內容char* str = strtok(arr, del);printf("%s\n", str); }以上面這段代碼為例:
將p所指向的字符串拷貝到arr中,將arr傳給strtok函數,再傳分隔符的字符串del,這樣函數就會找arr字符串中有沒有del中的字符,將找到的第一個標記改為'\0',這里找到的第一個標記就是'@',并返回指向這個標記起始位置的指針,這里我們用str接收,然后以str為指針打印字符串,就得到了"shandongkejidaxue"。
此時,我們要是想繼續打印接下來分割的字符串,還需要再用一次strtok函數,不過這次我們第一個參數就直接給NULL就行,因為當strtok函數的第一個參數不為 NULL ,函數將找到str中第一個標記,strtok函數將保存它在字符串中的位置,我們上一次用strtok函數時,他已經保存了第一個標記的位置,所以我們第二次使用strtok函數時第一個參數傳NULL,這時strtok函數的第一個參數為 NULL ,函數將在同一個字符串中被保存的位置開始,查找下一個標記,這樣一來,就可以繼續分割后面的字符串了。以此類推,第三次、第四次均是如此~
int main() {char* p = "shandongkejidaxue@985.com";const char* del = ".@";char arr[30];strcpy(arr, p);//將數據拷貝一份,處理arr數組的內容char* str = strtok(arr, del);printf("%s\n", str);str = strtok(NULL, del);printf("%s\n", str);str = strtok(NULL, del);printf("%s\n", str);}當我們不知道所要分割的字符串中含有多少個分隔符時,我們可以用循環來實現?
#include <stdio.h> int main() {char* p = "shandongkejidaxue@985.com";const char* del = ".@";char arr[30];char* str = NULL;strcpy(arr, p);//將數據拷貝一份,處理arr數組的內容for (str = strtok(arr, del); str != NULL; str = strtok(NULL, del)){//如果字符串中不存在更多的標記,則返回 NULL 指針,所以當str為NULL時就說明字符串已經分割完 //成了。printf("%s\n", str);} }?3. strerror
參數為錯誤碼
返回值為錯誤碼所對應的錯誤信息
這里的0、1、2、3、4均為錯誤碼,一個錯誤碼對應一個錯誤信息。
?那么怎么用這個函數呢?
這里舉一個例子:
//errno 為C語言提供的全局的錯誤碼變量,將錯誤碼記錄到該變量中 //頭文件為 <errno.h> #include <errno.h> int main() {//打開一個文件并讀取FILE* pf = fopen("test.txt", "r");if (pf == NULL)//若為NULL表示打開失敗{printf("%s\n", strerror(errno));}else{//讀文件//關閉文件fclose(pf);pf = NULL;}return 0; }?表示沒有找到該文件,即該文件不存在。
perror:
這里還有一個函數與strerror函數相似:
perror? ? ? ? ? ? ? ? ? (頭文件為? <stdio.h>)
int main() {//打開一個文件并讀取FILE* pf = fopen("test.txt", "r");if (pf == NULL)//若為NULL表示打開失敗{perror("fopen");//內容可以根據需要隨意更改~}else{//讀文件//關閉文件fclose(pf);pf = NULL;}return 0; }?
總結
以上是生活随笔為你收集整理的赶紧来修炼内功~字符串函数详解大全(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows:忘记本地账户开机密码,但
- 下一篇: 用ps制作android日历步骤,绘制一