C語言模擬實現(xiàn)庫函數(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;
}
//bacoBacon is your friend.
baco
1.1.3 str(n)cmp的模擬
逐個比較字符串中的字符
//-----------------------------------------------
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;
//找到字符串結尾
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’ ,并保存當前位置(存在靜態(tài)區(qū))
傳 非NULL : 從當前位置開始strtok傳 NULL : 從上次保存的位置開始strtok
比較奇怪的函數(shù),此處僅示范使用方法
//---------------------------------------------
char* strtok(char* str , const char* sep)
//---------------------------------------------
//由函數(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的使用
打印錯誤碼對應的信息
在C語言中設置了一個 名為 “errno” 的全局變量,來保存錯誤碼(不同運行錯誤的編號)
//---------------------------------
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ù)和字符串轉換函數(shù)
| 函數(shù) | 說明 |
|---|---|
| iscntrl | 任何控制字符 |
| isspace | 空白字符:空格‘ ’,換頁‘\f’,換行’\n’,回車‘\r’,制表符’\t’或者垂直制表符’\v’ |
| isdigit | 十進制數(shù)字 0~9 |
| isxdigit | 十六進制數(shù)字,包括所有十進制數(shù)字,小寫字母a~f,大寫字母A~F |
| islower | 小寫字母a~z |
| isupper | 大寫字母A~Z |
| isalpha | 字母a~z或A~Z |
| isalnum | 字母或者數(shù)字,az,AZ,0~9 |
| ispunct | 標點符號,任何不屬于數(shù)字或者字母的圖形字符(可打印) |
| isgraph | 任何圖形字符 |
| isprint | 任何可打印字符,包括圖形字符和空白字符 |
如果他的參數(shù)符合下列條件就返回真
汲取:
指針使用前 assert
用const保護不需要修改的數(shù)據(jù)
對于while中的指針的加減需要留心 while(*dest1++) 和 while(*dest2) { dest2++; }
- dest1跳出循環(huán)后是野指針
- dest2跳出循環(huán)后指向’\0’
到此這篇關于C語言模擬實現(xiàn)庫函數(shù)詳解的文章就介紹到這了,更多相關C語言庫函數(shù)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
ubuntu系統(tǒng)vscodeC++編譯環(huán)境配置與使用方式
這篇文章主要介紹了ubuntu系統(tǒng)vscodeC++編譯環(huán)境配置與使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12

