c語(yǔ)言字符串函數(shù)strstr,strtok,strerror的使用和實(shí)現(xiàn)
1,strtok函數(shù)的使用和模擬實(shí)現(xiàn)
char * strtok(char * str,const char * sep)(分隔字符串的作用)
會(huì)有static修飾變量,有記憶功能,會(huì)保存字符串的位置,下次找再繼續(xù)找。
1)sep參數(shù)指向一個(gè)字符串,它包含了0個(gè)或者多個(gè)由sep字符中一個(gè)或則多個(gè)分隔符分割的標(biāo)記。
2)第一個(gè)參數(shù)指定一個(gè)字符串,并將其用\0結(jié)尾,返回一個(gè)指向這個(gè)標(biāo)記的指針。
3)strtok函數(shù)的第一個(gè)參數(shù)不為NULL,函數(shù)將找到str中第一個(gè)標(biāo)記,strtok函數(shù)將保存它在字符串中的位置。
4)strtok函數(shù)的第一個(gè)參數(shù)為NULL,函數(shù)將在同一個(gè)字符串中被保存的位置開始,查找下一個(gè)標(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)對(duì)字符串分隔
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這個(gè)字符串,第一次出現(xiàn)的位置如果找不到了,就返回第一次出現(xiàn)的起始地址后面的字符也會(huì)接著運(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);//打印出第一個(gè)所在的起始位置
}
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是一個(gè)空字符串,返回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);//打印出第一個(gè)所出現(xiàn)的起始位置
}
return 0;
}3,strerror的使用和模擬實(shí)現(xiàn)
sterror函數(shù)可以把參數(shù)部分錯(cuò)誤碼對(duì)應(yīng)的錯(cuò)誤信息的字符串地址返回來。
一般是放在errno.h這個(gè)頭文件中說明的,c語(yǔ)言程序啟動(dòng)的時(shí)候就會(huì)使用一個(gè)全局變量error來記錄程序的當(dāng)前錯(cuò)誤碼,只不過程序啟動(dòng)的時(shí)候errno是0,表示沒有錯(cuò)誤,當(dāng)我們使用標(biāo)準(zhǔn)庫(kù)中的函數(shù)發(fā)生了某種錯(cuò)誤,就將會(huì)對(duì)應(yīng)的錯(cuò)誤碼,存放在erron中,strerror函數(shù)就可以將錯(cuò)誤對(duì)應(yīng)的錯(cuò)誤信息字符串的地址返回。
#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;
}有一個(gè)與之相似用法的函數(shù)
4,perror
sterror--將錯(cuò)誤碼對(duì)應(yīng)的錯(cuò)誤信息的字符串的起始地址返回
perror--將erron中錯(cuò)誤對(duì)用的錯(cuò)誤信息打印出來
perror打印方式:
函數(shù)先打印str指向的字符串,打印:,在打印一個(gè)空格,在打印錯(cuò)誤碼的錯(cuò)誤信息。
例如:
#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;
}
就自動(dòng)補(bǔ)齊冒號(hào)和空格,還有錯(cuò)誤的原因
//perror也相當(dāng)于printf+sterror。
到此這篇關(guān)于c語(yǔ)言字符串函數(shù)strstr,strtok,strerror的文章就介紹到這了,更多相關(guān)c語(yǔ)言 strstr,strtok,strerror內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C/C++?Qt?數(shù)據(jù)庫(kù)QSql增刪改查組件應(yīng)用教程
Qt?SQL模塊是Qt中用來操作數(shù)據(jù)庫(kù)的類,該類封裝了各種SQL數(shù)據(jù)庫(kù)接口,可以很方便的鏈接并使用。本文主要介紹了Qt數(shù)據(jù)庫(kù)QSql增刪改查組件的應(yīng)用教程,感興趣的同學(xué)可以學(xué)習(xí)一下2021-12-12
C++實(shí)現(xiàn)接兩個(gè)鏈表實(shí)例代碼
這篇文章主要介紹了C++實(shí)現(xiàn)接兩個(gè)鏈表實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-03-03
C++實(shí)現(xiàn)漢諾塔算法經(jīng)典實(shí)例
這篇文章主要介紹了C++實(shí)現(xiàn)漢諾塔算法經(jīng)典實(shí)例,代碼簡(jiǎn)潔高效,對(duì)于學(xué)習(xí)算法的朋友有一定的借鑒價(jià)值,需要的朋友可以參考下2014-07-07
C++模板基礎(chǔ)之函數(shù)模板與類模板實(shí)例詳解
C++ 除了支持函數(shù)模板,還支持類模板(Class Template),所以下面這篇文章主要給大家介紹了關(guān)于C++模板基礎(chǔ)之函數(shù)模板與類模板的相關(guān)資料,需要的朋友可以參考下2021-06-06

