日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

赶紧来修炼内功~字符串函数详解大全(三)

發布時間:2023/12/14 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 赶紧来修炼内功~字符串函数详解大全(三) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

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; }

?

總結

以上是生活随笔為你收集整理的赶紧来修炼内功~字符串函数详解大全(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。