C語言字符函式、記憶體函式 功能及實作
- strlen函式(求字串長度)
- 注意點
- 模擬實作
- strcpy函式(字串拷貝函式)
- 注意點
- 模擬實作
- strcat函式(字串銜接函式)
- 注意點
- 模擬實作
- strcmp函式
- 注意點
- 模擬實作
- strstr函式
- 模擬實作
- strtok函式
- 使用
- strerror函式
- 使用
- memcpy函式
- 注意點
- 模擬實作
- memmove函式
- 注意點
- 模擬實作
- memset函式
- 注意點
strlen函式(求字串長度)
統計字串長度直到\0為止
注意點
1、屬于<string.h>庫
2、引數為字串,回傳型別為無符號整型,特別注意下圖
此圖運行結果為>,因為無符號整型加減必為大于0的數,所以此類比較需要避免
3、結束標志為\0

模擬實作
int my_strlen(const char *str){
assert(str);
if(*str=='\0'){
return 0;
}
return 1 + my_strlen(str + 1);//采用遞回方式
}
strcpy函式(字串拷貝函式)
將sorc陣列內第一個\0前(包括\0)的所有內容拷貝到dest陣列,
注意點
1、dest陣列需要足夠容納source陣列
2、source陣列一定要有\0作為中止標識
3、dest陣列要可以更改
4、\0會被拷入
模擬實作
char *my_strcpy(char *dest,const char *sorc)
{
assert(dest && sorc);
char *ret = dest;
while (*dest++ = *sorc++)//當/0被最后一次拷入時,跳出回圈
{
;
}
return ret;
}
strcat函式(字串銜接函式)
從dest陣列的第一個\0開始將sorc函式內第一個\0前的全部內容拷貝,dest函式的第一個\0會被覆寫,sorc函式的\0會被拷入,
注意點
1、dest陣列要足夠容納自身和source陣列
2、dest陣列必須空間可修改
3、dest、source陣列都有\0
4、不可以自己拷貝自己,因為沒有中止條件
模擬實作
char *my_strcat(char *dest, const char *sorc)
{
char *ret = dest;
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *sorc++)
{
;
}
return ret;
}
strcmp函式
比較兩個字串,逐位比較,若對應位不相同則回傳ASCII碼相減的值,若每一位相同(即整個字串相同)回傳0,
注意點
1、比較的不是長度,而是對應位置的ASCII碼值
模擬實作
int my_strcmp(const char *str1, const char *str2)
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 == '\0' && *str2 == '\0')
{
return 0;
}
str1++;
str2++;
}
return *str1 - *str2;
}
strstr函式
在母串中尋找子串,若找到則回傳母串中子串的首地址,若沒找的則回傳空指標
模擬實作
此處使用暴力方法求解,KMP演算法可提供更優解
char *my_strstr(char *mum, char *child)
{
assert(mum && child);
const char *pc = mum;
while (*pc)
{
const char *p1 = pc;
const char *p2 = child;
while (*p1 == *p2 && *p1 && *p2)
{
p1++;
p2++;
}
if (*p2 == '\0')
{
return (char *)pc;
}
pc++;
}
return NULL;
}
strtok函式
1、兩個引數(arr源字串,sep符號字串(切割標志))
2、希望得到第二個字串時候需要傳入空指標

使用
int main()
{
char arr[]="skyline&csdn.com";
char arr2[30]={0};//因為strtok函式會修改源陣列,通常復制后處理
char sep[]="&.";
strcpy(arr2,arr);
printf("%s\n",strtok(arr2,sep));
printf("%s\n",strtok(NULL,sep));
printf("%s\n",strtok(NULL,sep));
return 0;
}
結果:

strerror函式
生成不同的錯誤報警
使用
int main()
{
prinf("%s\n",strerror(errno));//根據程式出現的問題輸出報錯字串
}
memcpy函式
一個位元組一個位元組的拷貝,共拷貝count個位元組;
注意點
1、此函式要對兩個不相關的記憶體塊(若相同由于演算法限制無法)比如
int main()
{
int num1[6] = {1, 2, 3, 4, 5, 6};
my_memcpy(num1+2, num1, 16);//希望得到121234
//實際得到121212
for (int i = 0; i < 6;i++){
printf("%d", num1[i]);
}
return 0;
}
模擬實作
void my_memcpy(void *dest, void *src, size_t count){
assert(dest && src);
while (count--)
{
*(((char *)dest)) = *(((char *)src));
dest=(char*)dest+1;//最好不要寫成++(char*)dest,gcc編譯器認為(char*)dest不可作為左值
src=(char*)src+1;
}
}
memmove函式
注意點
1、可以接受上文出現的相關記憶體
模擬實作
void my_memmove(void *dest, void *src, size_t count)
{
assert(dest && src);
if (dest > src)//當目標位置在源位置前,我們要從后向前拷貝
{
while (count--)
{
*(((char *)dest) + count) = *(((char *)src) + count);
}
}
else
{
while (count--)//)//當目標位置在源位置后,我們要從前向后拷貝
{
*(((char *)dest)) = *(((char *)src));
dest=(char*)dest+1;
src=(char*)src+1;
}
}
}
memset函式
將一個個位元組設定為某個值,共設定count個位元組
注意點
1、以位元組為單位設定的,如果int num[10]={0},memset(num,1,40),并不能使得陣列全為1,因為int陣列中一個元素為4個位元組實際是,每個元素變成01 01 01 01,所以這是錯誤的
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/257200.html
標籤:其他
上一篇:OsgEarth開發筆記(二):Osg3.6.3+OsgEarth3.1+vs2019x64開發環境搭建(中)
下一篇:Ubuntu中配置jdk環境變數
