網(wǎng)站首頁 編程語言 正文
前言
庫函數(shù)的模擬,看似多此一舉,實(shí)則汲取精華。
1.字符串函數(shù)
1.1字符串控制函數(shù)
1.1.1 strlen的模擬
求字符串長度
//-------------------------------------- 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; } //baco
Bacon 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 your
bacon 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)前位置開始strtok傳 NULL : 從上次保存的位置開始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語言中設(shè)置了一個(gè) 名為 “errno” 的全局變量,來保存錯(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ù) | 說明 |
---|---|
iscntrl | 任何控制字符 |
isspace | 空白字符:空格‘ ’,換頁‘\f’,換行’\n’,回車‘\r’,制表符’\t’或者垂直制表符’\v’ |
isdigit | 十進(jìn)制數(shù)字 0~9 |
isxdigit | 十六進(jìn)制數(shù)字,包括所有十進(jìn)制數(shù)字,小寫字母a~f,大寫字母A~F |
islower | 小寫字母a~z |
isupper | 大寫字母A~Z |
isalpha | 字母a~z或A~Z |
isalnum | 字母或者數(shù)字,az,AZ,0~9 |
ispunct | 標(biāo)點(diǎn)符號(hào),任何不屬于數(shù)字或者字母的圖形字符(可打印) |
isgraph | 任何圖形字符 |
isprint | 任何可打印字符,包括圖形字符和空白字符 |
如果他的參數(shù)符合下列條件就返回真
汲取:
指針使用前 assert
用const保護(hù)不需要修改的數(shù)據(jù)
對(duì)于while中的指針的加減需要留心 while(*dest1++)
和 while(*dest2) { dest2++; }
- dest1跳出循環(huán)后是野指針
- dest2跳出循環(huán)后指向’\0’
原文鏈接:https://blog.csdn.net/BaconZzz/article/details/125707122
相關(guān)推薦
- 2022-04-16 如何使用pyinstaller打包時(shí)引入自己編寫的庫_python
- 2022-11-21 詳解Go語言中的內(nèi)存對(duì)齊_Golang
- 2022-07-21 數(shù)據(jù)庫表數(shù)據(jù)操作-新增、刪除、修改
- 2023-01-08 Android?IntentFilter的匹配規(guī)則示例詳解_Android
- 2022-04-01 Python 中 __name__ == '__main__' 的作用
- 2022-11-17 Go語言學(xué)習(xí)教程之指針的示例詳解_Golang
- 2022-03-13 C語言實(shí)現(xiàn)求最大公約數(shù)的三種方法_C 語言
- 2022-07-27 P標(biāo)簽如何取消上下間隔
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支