c語言字符串函數(shù)strstr,strtok,strerror的使用和實(shí)現(xiàn)
1,strtok函數(shù)的使用和模擬實(shí)現(xiàn)
char * strtok(char * str,const char * sep)(分隔字符串的作用)
會有static修飾變量,有記憶功能,會保存字符串的位置,下次找再繼續(xù)找。
1)sep參數(shù)指向一個字符串,它包含了0個或者多個由sep字符中一個或則多個分隔符分割的標(biāo)記。
2)第一個參數(shù)指定一個字符串,并將其用\0結(jié)尾,返回一個指向這個標(biāo)記的指針。
3)strtok函數(shù)的第一個參數(shù)不為NULL,函數(shù)將找到str中第一個標(biāo)記,strtok函數(shù)將保存它在字符串中的位置。
4)strtok函數(shù)的第一個參數(shù)為NULL,函數(shù)將在同一個字符串中被保存的位置開始,查找下一個標(biāo)記。
5)如果字符串中不存在更多的標(biāo)記,則返回NULL指針。
strtok函數(shù)和strcpy的使用
#include<stdio.h> #include<string.h> int main() { char arr1[]="wangyiting@very.beautiful"; char arr2[]={0}; strcpy(arr2,arr1);//將arr1拷貝到arr2里面 char *sep="@.";//設(shè)置分隔符 char *ret=NULL;//初始化 //for循環(huán)對字符串分隔 for(ret=strtok(arr2,sep);ret!=NULL;ret=strtok(NULL,sep)) { printf("%s\n",ret);//換行打印出分隔開后的字符串 } return 0; }
2,strstr的使用和模擬實(shí)現(xiàn)
const char * strstr (const char * str1,const char * str2);
功能:在str1中找到了str2這個字符串,第一次出現(xiàn)的位置如果找不到了,就返回第一次出現(xiàn)的起始地址后面的字符也會接著運(yùn)行出來,如果找不到,就返回NULL。
#include<stdio.h> #include<string.h> int main() { char arr1[]="abcdefg"; char arr2[]="abc";//初始化 char *ret=strstr(arr1,arr2);//調(diào)用函數(shù) if(ret==NULL)//進(jìn)行判斷 { printf("不存在\n"); } else { printf("%s\n",ret);//打印出第一個所在的起始位置 } return 0; }
strstr的模擬實(shí)現(xiàn)
#include<stdio.h> #include<assert.h> const char * my_strstr(const char* str1,const char* str2) { assert(str1&&str2); const char* s1=NULL; const char* s2=NULL; const char* cur=str1; if(*str2=='\0') { return str1;//如果str2是一個空字符串,返回str1 } while(*cur!='\0') { s1=cur; s2=str2; while(*s1==*s2&&s1&&s2) { s1++;//判斷的字符相同則s1,s2,都進(jìn)行++ s2++; } if(*s2=='\0')//若是s2為\0則返回cur { return cur; } cur++; } } int main() { char arr1[]="abcdefg"; char arr2[]="cde";//初始化 const char* ret=my_strstr(arr1,arr2); if(ret==NULL)//進(jìn)行判斷 { printf("不存在\n"); } else { printf("%s\n",ret);//打印出第一個所出現(xiàn)的起始位置 } return 0; }
3,strerror的使用和模擬實(shí)現(xiàn)
sterror函數(shù)可以把參數(shù)部分錯誤碼對應(yīng)的錯誤信息的字符串地址返回來。
一般是放在errno.h這個頭文件中說明的,c語言程序啟動的時候就會使用一個全局變量error來記錄程序的當(dāng)前錯誤碼,只不過程序啟動的時候errno是0,表示沒有錯誤,當(dāng)我們使用標(biāo)準(zhǔn)庫中的函數(shù)發(fā)生了某種錯誤,就將會對應(yīng)的錯誤碼,存放在erron中,strerror函數(shù)就可以將錯誤對應(yīng)的錯誤信息字符串的地址返回。
#include<stdio.h> #include<string.h> int main() { int i=0; for(i=0;i<10;i++) { pritnf("%s\n",strerror(i)); } return 0; }
#include<stdio.h> #include<string.h> #include<errno.h> int main() { //打開文件 //用r方式打開,表示'讀‘以讀文件的形式 //打開文件,如果文件不存在,就打開失敗 FILE*pf=fopen("data.txt","r"); if(pf==NULL) { printf("打開文件失敗\n"); } else { printf("打開文件成功\n"); fclose(pf); pf=NULL; } return 0; }
有一個與之相似用法的函數(shù)
4,perror
sterror--將錯誤碼對應(yīng)的錯誤信息的字符串的起始地址返回
perror--將erron中錯誤對用的錯誤信息打印出來
perror打印方式:
函數(shù)先打印str指向的字符串,打?。海诖蛴∫粋€空格,在打印錯誤碼的錯誤信息。
例如:
#include<stdio.h> #include<string.h> #include<errno.h> int main() { //打開文件 //用r方式打開,表示'讀‘以讀文件的形式 //打開文件,如果文件不存在,就打開失敗 FILE*pf=fopen("data.txt","r"); if(pf==NULL) { printf("打開文件失敗,原因是:%s\n",strerror(erron)); perror("打開文件失敗,原因是"); } else { printf("打開文件成功\n"); fclose(pf); pf=NULL; } return 0; }
就自動補(bǔ)齊冒號和空格,還有錯誤的原因
//perror也相當(dāng)于printf+sterror。
到此這篇關(guān)于c語言字符串函數(shù)strstr,strtok,strerror的文章就介紹到這了,更多相關(guān)c語言 strstr,strtok,strerror內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言實(shí)現(xiàn)內(nèi)存函數(shù)的示例代碼
本文主要介紹了C語言實(shí)現(xiàn)內(nèi)存函數(shù)的示例代碼,包括memcpy、memmove、memset和memcmp的使用,具有一定的參考價(jià)值,感興趣的可以了解一下2025-02-02C語言實(shí)現(xiàn)簡易網(wǎng)絡(luò)聊天室
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡易網(wǎng)絡(luò)聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06C語言之實(shí)現(xiàn)棧的基礎(chǔ)創(chuàng)建
這篇文章主要介紹了C語言之實(shí)現(xiàn)棧的基礎(chǔ)創(chuàng)建,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07Qt中網(wǎng)絡(luò)編程的實(shí)現(xiàn)
本文主要介紹了Qt中網(wǎng)絡(luò)編程的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02C語言中進(jìn)行函數(shù)指針回調(diào)的實(shí)現(xiàn)步驟
在 C 語言中,函數(shù)指針的回調(diào)是一種強(qiáng)大的編程技術(shù),它允許我們在特定的事件發(fā)生或特定的條件滿足時,調(diào)用由用戶定義的函數(shù),這種機(jī)制增加了程序的靈活性和可擴(kuò)展性,使得代碼更具通用性和可重用性,本文給大家介紹了C語言中進(jìn)行函數(shù)指針回調(diào)的實(shí)現(xiàn)步驟,需要的朋友可以參考下2024-07-07C++11 寫一個只觸發(fā)一次槽函數(shù)的Qt connect函數(shù)
這篇文章主要為大家介紹了C++11 寫一個只觸發(fā)一次槽函數(shù)的Qt connect函數(shù)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09QT實(shí)現(xiàn)將兩個時間相加的算法[hh:?mm?+?hh:?mm]的示例代碼
本文主要介紹了QT實(shí)現(xiàn)將兩個時間相加的算法[hh:?mm?+?hh:?mm]的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07