?
目錄
?前言:
一.常見函數(shù)的介紹與模擬實現(xiàn)
一.strlen函數(shù)
1.1? strlen函數(shù)的介紹
1.2? strlen的模擬實現(xiàn)(三種方式實現(xiàn))
第一種:計數(shù)器的方式
第二種:遞歸的方式
第三種:指針-指針的方式
二.strcpy函數(shù)與strncpy函數(shù)
2.1? strcpy函數(shù)的介紹?
2.2strncpy函數(shù)的介紹?
2.3? strcpy的模擬實現(xiàn)
三.strcat函數(shù)與strncat函數(shù)
3.1? strcat函數(shù)的介紹
3.2? strncat函數(shù)的介紹?
3.3? strcat函數(shù)的模擬實現(xiàn)
四.strcmp函數(shù)與strncmp函數(shù)
4.1 strcmp?函數(shù)的介紹
4.2? strncmp函數(shù)的介紹
五.strstr函數(shù)
5.1? strstr函數(shù)的介紹
5.2? strstr函數(shù)的模擬實現(xiàn)
總結(jié):
?前言:
C語言中對字符和字符串的處理很是頻繁,但是C語言本身是沒有字符串類型的,字符串通常放常量字符串中或則字符數(shù)組中;字符串常量使用于那些對它不做修改的字符串函數(shù);?
一.常見函數(shù)的介紹與模擬實現(xiàn)
?文章來源地址http://www.zghlxwxcb.cn/news/detail-602921.html
一.strlen函數(shù)
1.1? strlen函數(shù)的介紹
~字符串是以 '\0'?作為結(jié)束標(biāo)志的,strlen函數(shù)返回的是字符串'\0'前面出現(xiàn)的字符個數(shù)(不包含'\0');
~strlen函數(shù)的參數(shù)指向的字符串必須要以'\0'結(jié)束;
~函數(shù)的返回值是size_t,是無符號(特別注意,易錯);(如下代碼)
?
?分析:
strlen(str1)=3;
strlen(str2)=6;
而 3-6=-3 應(yīng)該是小于0的數(shù),運行出結(jié)果卻是大于;因為strlen函數(shù)返回值是無符號的,無符號減去無符號的數(shù),結(jié)果也被當(dāng)成無符號的數(shù),而-3當(dāng)成無符號的數(shù)是一個很大的數(shù);
1.2? strlen的模擬實現(xiàn)(三種方式實現(xiàn))
第一種:計數(shù)器的方式
int my_strlen(const char * str) {
int count = 0;
while(*str)
{
count++;
str++;
}
return count;
}
第二種:遞歸的方式
int my_strlen(const char * str) {
if(*str == '\0')
return 0;
else
return 1+my_strlen(str+1);
}
第三種:指針-指針的方式
int my_strlen(char *s) {
? ? ? char *p = s;
? ? ? while(*p != ‘\0’ )
? ? ? ? ? ? ?p++;
? ? ? return p-s; }
?
二.strcpy函數(shù)與strncpy函數(shù)
2.1? strcpy函數(shù)的介紹?
strcpy函數(shù)是將源字符串的字符一個一個進行拷貝目標(biāo)空間去;
這里的strcpy函數(shù)返回值為目標(biāo)空間的起始地址,方便鏈?zhǔn)皆L問;
如printf("%s\n",strcpy(arr1,arr2));
~源字符串必須以'\0'結(jié)束;
~會將源字符串的'\0'拷貝到目標(biāo)空間;
目標(biāo)空間不許足夠大,以確保能存放源字符串;(如果目標(biāo)空間較小時,放不下源字符串,會出錯);
目標(biāo)空間必須可變;
2.2strncpy函數(shù)的介紹?
strncpy函數(shù)的作用與strcpy函數(shù)相似,只是在strcpy函數(shù)的基礎(chǔ)上加上了需要拷貝的字符數(shù),拷貝完再在末尾放個'\0';
例如:strncpy(arr1,arr2,4)? 作用是將arr2中4個字符拷貝到arr1中;
? ? ? ? ? ?strcpy(arr1,arr2)? ? ? ?作用是將arr2整個字符串拷貝到arr1中;
2.3? strcpy的模擬實現(xiàn)
char* my_strcpy(char* dest, const char* src)
{
char* ret = dest; //記住目標(biāo)空間的起始地址
assert(dest != NULL);
assert(src != NULL);
while (*src!='\0')
{
*dest=*src;
dest++;
src++;
}
return ret; //返回目標(biāo)空間的起始地址
}
三.strcat函數(shù)與strncat函數(shù)
3.1? strcat函數(shù)的介紹
~源字符串必須以'\0'結(jié)束;
~目標(biāo)空間必須有足夠的大,能容納下源字符串的內(nèi)容;
~目標(biāo)空間必須可修改;
注意:字符串不能給自己追加字符串;
3.2? strncat函數(shù)的介紹?
strncat函數(shù)的作用與strcat函數(shù)相似,只是在strcat函數(shù)的基礎(chǔ)上加上了需要追加的字符數(shù);追加完后再在末尾放個'\0'
例如:strcat(arr1,arr2)? ? ? ? ? 作用是將arr2中整個字符串追加到arr1后面
? ? ? ? ? ?strncat(arr1,arr2,4)? ? ?作用是將arr2中4個字符追加到arr1的后面
3.3? strcat函數(shù)的模擬實現(xiàn)
char* my_strcat(char* dest, const char* src)
{
char* ret = dest;
assert(dest != NULL);
assert(src != NULL);
while (*dest)
{
dest++;
}
while ((*dest++ = *src++))
{
;
}
return ret;
}
四.strcmp函數(shù)與strncmp函數(shù)
4.1 strcmp?函數(shù)的介紹
?~標(biāo)準(zhǔn)規(guī)定:
如果第一個字符串大于第二個字符串,返回大于0的數(shù)字;
如果第一個字符串小于第二個字符串,返回小于0的數(shù)字;
如果第一個字符串等于第二個字符串,返回0;
怎么判斷大小呢?
兩個字符串內(nèi)容,一個一個字符依次比較,如
str1? :? ?" asdfgh"? ? ? ? str2 :"asdagh"? ? ??
第一個字符與第一個字符相比,相等,再比較后面的一個字符,知道遇到不同的字符或則遇到'\0'(至少一個字符串遇到'\0');
如上面的兩個字符串,前三個字符都一樣,比第四個,f>a? ??
所以str1>str2? 如下圖
4.2? strncmp函數(shù)的介紹
strncmp函數(shù)的作用與strcmp函數(shù)相似,只是在strcmp函數(shù)的基礎(chǔ)上加上了需要比較到的第幾個字符;
例如:strcmp(arr1,arr2)? ? ? ? ? 作用是將arr1整個字符串與arr2整個字符串比較
? ? ? ? ? ?strncmp(arr1,arr2,4)? ? ?作用是將arr1中前4個字符與arr2中前4個字符比較
4.3? strcmp?函數(shù)的模擬實現(xiàn)
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 != NULL);
assert(str2 != NULL);
while (*str1==*str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
if (*str1 > *str2)
return 1;
else
return -1;
}
五.strstr函數(shù)
5.1? strstr函數(shù)的介紹
?函數(shù)的作用:(字符串中找子字符串)
返回指向?str2?中第一次出現(xiàn)的 str1 的指針,如果?str2 不是?str1?的一部分,則返回一個空指針。
匹配過程不包括終止空字符,但它到此為止。
5.2? strstr函數(shù)的模擬實現(xiàn)
char * ?strstr (const char * str1, const char * str2)
{
? ? ? ?char *cp = (char *) str1;
? ? ? ?char *s1, *s2;
? ? ? ?if ( !*str2 )
? ? ? ? ? ?return((char *)str1);
? ? ? ?while (*cp)
? ? ? {
? ? ? ? ? ? ? ?s1 = cp;
? ? ? ? ? ? ? ?s2 = (char *) str2;
? ? ? ? ? ? ? ?while ( *s1 && *s2 && !(*s1-*s2) )
? ? ? ? ? ? ? ? ? ? ? ?s1++, s2++;
? ? ? ? ? ? ? ?if (!*s2)
? ? ? ? ? ? ? ? ? ? ? ?return(cp);
? ? ? ? ? ? ? ?cp++;
? ? ? }
? ? ? ?return(NULL);
}
總結(jié):
1.? strcpy? ??strcat? ?strcmp? 這三個函數(shù)特別關(guān)注?'\0',不關(guān)注字符串有多長,所以這三個函數(shù)叫長度不受限制的字符串函數(shù);
2.? strncpy? ?strncat? ? strncmp? 是長度受限制的字符串函數(shù);? ?
如果覺得文章不錯,期待你的一鍵三連哦,你的鼓勵是我創(chuàng)作的動力之源,讓我們一起加油,一起奔跑,讓我們頂峰相見!文章來源:http://www.zghlxwxcb.cn/news/detail-602921.html
?
到了這里,關(guān)于深入探索字符串函數(shù)與模擬實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!