歡迎來CILMY23的博客喔,本期系列為?【C語言】長篇詳解,字符系列篇3-----strstr,strtok,strerror字符串函數(shù)的使用【圖文詳解?】,圖文講解各種字符串函數(shù),帶大家更深刻理解C語言中各種字符串函數(shù)的應用,感謝觀看,支持的可以給個贊哇。?
前言
上一篇說到,有不受長度限制的字符串函數(shù),它們分別是strcpy,strcat,strcmp,為了方便我們想要長度限制,C語言提供了三個加n的函數(shù),strncpy,strncat,strncmp函數(shù),本期將了解剩下的三個字符串函數(shù),它們分別是strstr,strtok,strerror。
目錄
?一、strstr
二、strtok
三、strerror
?一、strstr?
?strstr函數(shù)可以在cplusplus中查到,strstr - C++ Reference (cplusplus.com)
函數(shù)原型如下:
const char * strstr ( const char * str1, const char * str2 );
char * strstr ( char * str1, const char * str2 );
?函數(shù)介紹如下:
返回值和使用案例:
?
strstr的使用
?strstr函數(shù)功能就是返回str2在str1中第一次出現(xiàn)的位置,如果str2沒有在str1中出現(xiàn),就返回NULL
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "hello CILMY23";
char arr2[] = "C";
char* ret = strstr(arr1, arr2);
if (ret != NULL)
printf("%s \n", ret);
else
printf("找不到\n");
ret = strstr(arr2, arr1);
if (ret != NULL)
printf("%s \n", ret);
else
printf("找不到\n");
return 0;
}
結果如下:
?strstr的模擬實現(xiàn)
為了檢驗自己寫的是否對不對,我們拿出幾組的測試用例
void Judge(char* p)
{
if (p != NULL)
printf("%s \n", p);
else
printf("找不到\n");
}
int main()
{
char arr1[] = "hello CILMY23";
char arr2[] = "C";
char arr3[] = "lllC";
char arr4[] = "This is a simple string";
char arr5[] = "";
char* ret = strstr(arr1, arr2);
Judge(ret);
ret = strstr(arr2, arr1);
Judge(ret);
ret = strstr(arr3, arr1);
Judge(ret);
ret = strstr(arr3, arr2);
Judge(ret);
ret = strstr(arr1, arr3);
Judge(ret);
ret = strstr(arr2, arr3);
Judge(ret);
ret = strstr(arr4, "simple");
Judge(ret);
ret = strstr(arr1, arr5);
Judge(ret);
return 0;
}
?這組測試用例的結果是:
思路一?
?思路解析:
遍歷源字符串,找到與字符串2首字母相同的字符,進入循環(huán)2,但在進入之前需要保存一份當前位置,然后我們再去利用新開辟出來的兩個指針去遍歷兩個字符串,如果有不相等的地方,那么字符串肯定是走不到尾巴的,也就是不可能等于'\0',此時繼續(xù)遍歷字符串1,直到字符串1遍歷結束,完成整個字符串的查找,沒有就返回NULL。
char * my_strstr(const char* str1,const char* str2)
{
assert(str1 && str2);
char* str3 = NULL;
char* str4 = NULL;
while (*str1 != '\0')
{
str4 = str2;
str3 = str1;
while(*str3 == *str4 && *str3 && *str4)
{
str3++;
str4++;
}
if (*str4 == '\0')
return str1;
str1++;
}
return NULL;
}
?邏輯圖如下:
代碼優(yōu)化
代碼優(yōu)化解析:
1.我們并不希望在遍歷字符串的時候所有的值都被修改,包括我后續(xù)返回的地址,所以全部都可以用const修飾
2.當我第二個字符串為空的時候,返回字符串1的地址,就相當于你讓我在一個字符串里找什么都沒有的東西,庫里設計是返回第一個字符串地址
3.我們不希望改變原有的地址,str1,和str2,所以再創(chuàng)建一個指針變量用來代替上述str1的使用?
const char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
const char* cp = str1;
const char* s1 = NULL;
const char* s2 = NULL;
if (*str2 == '\0')
{
return str1;
}
while (*cp)
{
s1 = cp;
s2 = str2;
while (*s1 == *s2 && *s1 != '\0' && *s2 != '\0')
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return cp;
}
cp++;
}
return NULL;
}
根據(jù)測試用例跑出來的結果如下:?
?
二、strtok
了解strtok函數(shù)之前,我們要先了解一個概念,相信大家都看過IP地址, 計算機網(wǎng)絡通信協(xié)議是用的IP協(xié)議,于是鏈接進互聯(lián)網(wǎng)的設備會有一個IP地址,這個IP地址,IP地址通常用“點分十進制”表示成(a.b.c.d)的形式
例如:192.168.1.23
?IP地址的本質還是一個整數(shù),因為不好記,才有了點分十進制的表示方式。
那如果我們想把這個IP地址的每個數(shù)字取出來就會用到,strtok這個函數(shù)。又或者你想把郵箱的域名,郵箱名,域名后綴取出來也會用到strtok這個函數(shù)。其中@和.這種東西我們就把它稱作分隔符
strtok網(wǎng)站以及函數(shù)原型如下:
strtok - C++ Reference (cplusplus.com)
char * strtok ( char * str, const char * delimiters );
?strtok的函數(shù)介紹:
?
返回值和使用案例:?
strtok的使用
#include<stdio.h>
#include<string.h>
int main()
{
char str1[] = "hello.CIL.MY@23";
char buf[60] = { 0 };
strcpy(buf, str1);
char* p = ".@";
char* r = NULL;
for (r = strtok(buf, p); r != NULL; r = strtok(NULL, p))
{
printf("%s", r);
}
return 0;
}
打印結果如下:
?strtok總結:
? ? ?sep參數(shù)指向?個字符串,定義了用作分隔符的字符集合
? ? ?第?個參數(shù)指定?個字符串,它包含了0個或者多個由sep字符串中?個或者多個分隔符分割的標記
? ? ?strtok函數(shù)找到str中的下?個標記,并將其用\0 結尾,返回?個指向這個標記的指針。(注: strtok函數(shù)會改變被操作的字符串,所以在使?strtok函數(shù)切分的字符串?般都是臨時拷貝的內容并且可修改。)
? ? ?strtok函數(shù)的第?個參數(shù)不為NULL ,函數(shù)將找到str中第?個標記,strtok函數(shù)將保存它在字符串中的位置。
? ? ?strtok函數(shù)的第?個參數(shù)為NULL ,函數(shù)將在同?個字符串中被保存的位置開始,查找下?個標記。
? ? ?如果字符串中不存在更多的標記,則返回NULL 指針。
三、strerror
strerror 的網(wǎng)址:
strerror - C++ Reference (cplusplus.com)?
函數(shù)原型:
char * strerror ( int errnum );
函數(shù)介紹如下:?
函數(shù)的功能及使用案例:
?函數(shù)解析:
strerror是一個返回錯誤碼所對應的錯誤字符串的起始地址,在C語言的庫函數(shù)中設計錯誤碼,當我們庫函數(shù)在調用過程中發(fā)生錯誤信息了,要記錄下來,這就是錯誤碼。是一個編碼。
當庫函數(shù)調用失敗的時候,會將錯誤碼記錄到變量errno當中,errno是C語言中的一個全局變量。
strerror的使用
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d:%s \n",i,strerror(i));
}
return 0;
}
?結果如下:文章來源:http://www.zghlxwxcb.cn/news/detail-836003.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-836003.html
到了這里,關于?【C語言】長篇詳解,字符系列篇3-----strstr,strtok,strerror字符串函數(shù)的使用【圖文詳解?】的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!