C語(yǔ)言模擬實(shí)現(xiàn)庫(kù)函數(shù)詳解
前言
庫(kù)函數(shù)的模擬,看似多此一舉,實(shí)則汲取精華。
1.字符串函數(shù)
1.1字符串控制函數(shù)
1.1.1 strlen的模擬
求字符串長(zhǎng)度
//--------------------------------------
size_t strlen( const char *string );
//--------------------------------------
//返回值用 int / size_t 各有好處
int MyStrlen(const char* str)
{
assert(str);
int cnt = 0;
while (*str != '\0')
{
str++;
cnt++;
}
return cnt;
}
int main()
{
char arr[] = "bacon";
printf("%d\n", MyStrlen(arr));
return 0;
}1.1.2 str(n)cpy的模擬
拷貝字符串
//-------------------------------------
char* strcpy(char* dest, const char* src)
//-------------------------------------
char* MyStrcpy(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest++ = *src++);
return ret;
}
int main()
{
char str1[30] = "Bacon";
char str2[] = " is your friend.";
MyStrcpy(str1 + 5, str2);
printf("%s\n", str1);
return 0;
}
//Bacon is your friend.
//------------------------------------------------------------
char* strcpy(char* dest, const char* src, size_t num)
//---------------------------------------------------------------
char* MyStrncpy(char* dest, const char* src, size_t num)
{
assert(dest && src);
char* ret = dest;
while (num--)
{
*dest++ = *src++;
}
return ret;
}
int main()
{
char str1[20] = { 0 };
char str2[] = "bacon";
printf("%s\n", MyStrncpy(str1, str2, 4));
return 0;
}
//bacoBacon is your friend.
baco
1.1.3 str(n)cmp的模擬
逐個(gè)比較字符串中的字符
//-----------------------------------------------
int strcmp(const char* str1, const char* str2)
//-----------------------------------------------
int MyStrcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 != '\0' && *str2 != '\0' && *str1 == *str2)
{
str1++;
str2++;
}
if (*str1 == *str2)
return 0;
else if (*str1 > *str2)
return 1;
else
return -1;
}
int main()
{
char str1[] = "abcdef";
char str2[] = "abcdfe";
printf("%d\n", MyStrcmp(str1, str2));
return 0;
}
//-1
//-----------------------------------------------------
int strncmp(const char* str1, const char* str2, size_t num)
//---------------------------------------------------------
int MyStrncmp(const char* str1, const char* str1, size_t num)
{
assert(dest && src);
while (num--)
{
if (*str1!= *str2)
{
if (*str1> *str2)
return 1;
else
return -1;
}
str1++;
str2++;
}
return 0;
}
int main()
{
char str1[] = "abcdef";
char str2[] = "abcdfe";
printf("%d\n", MyStrncmp(str1, str2, 5));
return 0;
}-1
1.1.4 str(n)cat的模擬
字符串追加
//----------------------------------------------
char* strcat(char* dest, const chat* src)
//----------------------------------------------
char* MyStrcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
//找到字符串結(jié)尾
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *src++);
return ret;
}
int main()
{
char str1[20] = "bacon";
char str2[] = " king";
printf("%s\n", MyStrcat(str1 , str2));
return 0;
}
//bacon king
//----------------------------------------------------------
char* strncat(char* dest, const char* src, size_t num);
//----------------------------------------------------------
char* MyStrncat(char* dest, const char* src, size_t num)
{
assert(dest && src);
char* ret = dest;
while(*dest != '\0')
{
dest++;
}
while (num--)
{
*dest++ = *src++;
}
return ret;
}
int main()
{
char str1[30] = "Bacon";
char str2[] = " is your friend";
printf("%s\n", MyStrncat(str1, str2, 8));
return 0;
}
//Bacon is yourbacon king
Bacon is your
1.1.5 strstr的模擬
查找子串
//------------------------------------------------
char* strstr(const char* str1, const char* str2)
//--------------------------------------------------
char* MyStrstr(const char* str1, const char* str2)
{
assert(str1 && str2);
char* p = str1;
char* s1 = str1;
char* s2 = str2;
while (*p)//str1走完就可以跳出了
{
//找到可能匹配的位置
while (*s1 != *s2)
{
s1++;
}
p = s1;
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return p;
}
else
{
s1 = p + 1;
s2 = str2;
p = s1;
}
}
return NULL;
}
int main()
{
char str1[] = "abbbcdef";
char str2[] = "bbc";
printf("%s\n", MyStrstr(str1, str2));
return 0;
}1.1.6 strtok的使用
切分字符串:根據(jù)給定的分隔符,把分隔符置 ‘\0’ ,并保存當(dāng)前位置(存在靜態(tài)區(qū))
傳 非NULL : 從當(dāng)前位置開(kāi)始strtok傳 NULL : 從上次保存的位置開(kāi)始strtok
比較奇怪的函數(shù),此處僅示范使用方法
//---------------------------------------------
char* strtok(char* str , const char* sep)
//---------------------------------------------
//由函數(shù)定義:我們需要多次切分的時(shí)候——第一次傳字符串地址,之后傳NULL
int main()
{
char* p = "SiDiuPiDe233@icloud.com";
char sep[] = "@.";
char arr[30];
strcpy(arr, p);
char* i = NULL;
for (i = strtok(arr, sep); i != NULL; i = strtok(NULL, sep))
{
printf("%s\n", i);
}
return 0;
}
SiDiuPiDe
icloud
com
1.1.7 strerror的使用
打印錯(cuò)誤碼對(duì)應(yīng)的信息
在C語(yǔ)言中設(shè)置了一個(gè) 名為 “errno” 的全局變量,來(lái)保存錯(cuò)誤碼(不同運(yùn)行錯(cuò)誤的編號(hào))
//---------------------------------
char* strerror(int errnum);
//-----------------------------------
int main()
{
FILE* p = fopen("test.txt", "r");
if (NULL == p)
printf("%s\n", strerror(errno));
return 0;
}
No such file or directory
1.2 字符串分類函數(shù)和字符串轉(zhuǎn)換函數(shù)
| 函數(shù) | 說(shuō)明 |
|---|---|
| iscntrl | 任何控制字符 |
| isspace | 空白字符:空格‘ ’,換頁(yè)‘\f’,換行’\n’,回車‘\r’,制表符’\t’或者垂直制表符’\v’ |
| isdigit | 十進(jìn)制數(shù)字 0~9 |
| isxdigit | 十六進(jìn)制數(shù)字,包括所有十進(jìn)制數(shù)字,小寫(xiě)字母a~f,大寫(xiě)字母A~F |
| islower | 小寫(xiě)字母a~z |
| isupper | 大寫(xiě)字母A~Z |
| isalpha | 字母a~z或A~Z |
| isalnum | 字母或者數(shù)字,az,AZ,0~9 |
| ispunct | 標(biāo)點(diǎn)符號(hào),任何不屬于數(shù)字或者字母的圖形字符(可打印) |
| isgraph | 任何圖形字符 |
| isprint | 任何可打印字符,包括圖形字符和空白字符 |
如果他的參數(shù)符合下列條件就返回真
汲?。?/p>
指針使用前 assert
用const保護(hù)不需要修改的數(shù)據(jù)
對(duì)于while中的指針的加減需要留心 while(*dest1++) 和 while(*dest2) { dest2++; }
- dest1跳出循環(huán)后是野指針
- dest2跳出循環(huán)后指向’\0’
到此這篇關(guān)于C語(yǔ)言模擬實(shí)現(xiàn)庫(kù)函數(shù)詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言庫(kù)函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C字符串操作函數(shù)的實(shí)現(xiàn)詳細(xì)解析
以下是對(duì)C語(yǔ)言中字符串操作函數(shù)的實(shí)現(xiàn)進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-08-08
淺談c++性能測(cè)試工具google benchmark
本文將會(huì)介紹如何使用模板以及參數(shù)生成器來(lái)批量生成測(cè)試用例,簡(jiǎn)化繁瑣的性能測(cè)試代碼2021-06-06
C++中標(biāo)準(zhǔn)線程庫(kù)的基本使用介紹
大家好,本篇文章主要講的是C++中標(biāo)準(zhǔn)線程庫(kù)的基本使用介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02
ubuntu系統(tǒng)vscodeC++編譯環(huán)境配置與使用方式
這篇文章主要介紹了ubuntu系統(tǒng)vscodeC++編譯環(huán)境配置與使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
c語(yǔ)言double類型默認(rèn)輸出小數(shù)幾位
在本篇文章里小編給大家分享的是關(guān)于c語(yǔ)言double類型默認(rèn)輸出小數(shù)幾位的相關(guān)知識(shí)點(diǎn),需要的朋友們可以學(xué)習(xí)下。2020-04-04
C語(yǔ)言實(shí)現(xiàn)游戲VIP停車場(chǎng)管理系統(tǒng)
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)游戲VIP停車場(chǎng)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12

