strlen 函數原型:
size_t strlen(const char* string);
功能: 計算字元串長度,遇到‘/’停下;
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
//用計數器統計
int my_strlen(const char*str)
{
assert(str != NULL);
int count = ;
//在遇到'/0'之前,指針向後挪動一次,count加1
while (*str++)
{
count++;
}
return count;
}
//利用指針相減
int my_strlen(const char*str)
{
assert(str != NULL);
char*pc = str;
//在遇到'/0'之前,通過指向向後挪動找到'/0',的位址
while (*pc++)
{
;
}
//'/0'址減去起始位址 為字元串長度
return pc - str-;
}
//利用遞歸的方式實作
int my_strlen(const char*str)
{
assert(str != NULL);
if (*str == '\0')
{
return ;
}
else
return + my_strlen(str + );
}
int main()
{
const char *p = "abcdef";
int ret = my_strlen(p);
printf("%d\n",ret);
system("pause");
return ;
} //模拟實作strlen
strcpy 函數原型:
char * strcpy(char* strDestination, const char *strSource);
功能:實作把src所指向位址空間的内容拷貝到dest指針開始指向位址空間 ,遇到'/0'結束拷貝.
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
char* my_strcpy(char* dest,const char* str)
{
assert(str != NULL);
assert(dest != NULL);
char*p = str;
while (*dest++ = *str++)
{
;
}
}
int main()
{
const char arr1[] = "abcdef";
char arr2[] = "aaaaaaaaaaa";
my_strcpy(arr2, arr1);
printf("%s\n", arr2);
system("pause");
return ;
}//strcay的模拟實作
strcat 函數原型:
char * strcat(char* strDestination, const char *strSource);
功能:把src所指向的字元串追加到dest所指向字元串的後面;
實作:找到dest所指向字元串的’/‘的位址,将src的内容追加到後面,知道src所指向的内容指向’/‘結束;
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
char* my_strcat(char*dest,const char*str)
{
assert(str != NULL);
assert(dest != NULL);
while (*dest++)
{
//為了得到目标字元串的\0
;
}
//dest現在指向的是\'0'後的一個空間,-1才能得到'\0'指向的空間
dest--;
//把源賦給目标,為'\0'的時候跳出循環
while(*dest++ = *str++)
{
;
}
}
int main()
{
char arr1[] = "abcd";
char arr2[] = "efgh";
my_strcat(arr1, arr2);
printf("%s\n", arr1);
system("pause");
return ;
} //strcat的模拟實作
strstr函數原型:
char * strstr(const char* strDestination, const char *strSource);
功能: 在dest所指向内容裡面找子字元串src,找到傳回子字元串起始位址 ,找不到 傳回NULL;
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
int my_strstr(const char*str1, const char*str2)
{
assert(str1 != NULL);
assert(str2 != NULL);
const char*s1 = str1;
const char*s2 = str2;
const char*p = str1;
while (*p != '\0')
{
//每次循環完了之後,給s1指派p+1;保證s2和s1的第一個值進行比較
s1 = p;
//保證s2每次比較都是首元素開始的
s2 = str2;
while (*s1 == *s2)
{
s1++;
s2++;
}
//跳出循環有兩種情況1. s2不等于s1 2. s2比較完了
if (*s2 == '\0')
{
return p;
}
p++;
}
return NULL;
}
int main()
{
const char arr1[] = "abbbcdef";
const char arr2[] = "bcd";
char* ret = my_strstr(arr1, arr2);
if (ret == NULL)
{
printf("NO\n");
}
else
{
printf("%s\n", ret);
}
system("pause");
return ;
} //strstr 的模拟實作
srtcpmp函數原型:
int strcat(const char* strDestination, const char *strSource);
比較規則: 兩個字元串從左至右逐個比較,按ASC||的值比較;遇到'/0'結束;
目标和源相等傳回;
目标大于源傳回一個正數;
目标小于源傳回一個負數;
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
int my_strcmp(const char*str1, const char* str2)
{
assert(str1 != NULL);
assert(str2 != NULL);
const char*s1 = str1;
const char*s2 = str2;
//如果兩個字元串的首字元相等,判斷源是不是到'/0',如果不是繼續向後面找,如果是傳回0
while (*s1 == *s2)
{
if (*s1 == '\0')
{
return ;
}
s1++;
s2++;
}
//如果不相等,傳回他們相減的結果
return *s1 - *s2;
}
int main()
{
const char*p1 = "abcdef";
const char*p2 = "abcdeef";
int ret = my_strcmp(p1, p2);
printf("%d\n", ret);
system("pause");
return ;
}