字串函式的模擬實現(strlen、strcpy、strcat、strcmp)
技術標籤:c語言
文章目錄
一、strlen
1.庫函式中的strlen
庫函式中的strlen是用來求字串長度的(不包含’\0’)
用法如下:
int main()
{
char arr[] = "abcdef";
int sum = strlen(arr);
printf("%d\n", sum);
return 0;
}
2.模擬實現strlen
(1)計數器實現
思路:定義一個計數器count,從0開始,當字串元素不為’\0’時,count++,為’\0’時停止
程式碼如下(示例):
int my_strlen1(char* p)
{
int count = 0;
while (*p != '\0')
{
count++;
p++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
int sum = my_strlen1 (arr);
printf("%d\n", sum);//sum = 6
return 0;
}
(2)遞迴實現
思路:以字串"abcdef"為例
strlen(“abcdef”)
=1 + strlen(“bcdef”)
=1 + 1 + strlen(“cdef”)
=1 + 1 + 1 + strlen(“def”)
=1 + 1 + 1 + 1 + strlen(“ef”)
=1 + 1 + 1 + 1 + 1 + strlen(“f”)
=1 + 1 + 1 + 1 + 1 + 1 = 6
程式碼如下(示例):
int my_strlen2(char * p)//p指向字串的首元素
{
if (*p != '\0')
//直到找到'\0'為止
return 1 + my_strlen2(p + 1);
//p+1指向字串的下一個元素
else
return 0;
}
int main()
{
char arr[] = "abcdef";
sum = my_strlen2(arr);
printf("%d\n", sum);//sum = 6
return 0;
}
二、strcpy
1.庫函式中的strcpy
庫函式中的strcpy可拷貝字串。
char* strcpy(char* dest, const char* src);
表示將字串src中的內容拷貝到字串dest中(包含’\0’)並返回dest的地址。
用法如下:
int main()
{
char arr1[50] = "******************";
char arr2[] = "hello world!";
char* parr1 = strcpy(arr1, arr2);
//將arr2中的內容拷貝到arr1中,並返回arr1的地址
printf("%s\n", arr1);
printf("%s\n", parr1);
return 0;
}
2.模擬實現strcpy
思路:遍歷陣列src中的每一個元素,並將每一個元素放入dest中。
程式碼如下(示例):
void my_strcpy(char* dest, char* src)
{
while (*src != '\0')
{
*dest = *src;
dest++;
src++;
}
*dest = *src;
//將'\0'拷貝到dest中
}
以上程式碼是strcpy的基本功能。
針對以上程式碼可以進行進一步優化。
程式碼如下(示例):
//庫函式中strcpy的返回值是dest的地址
char* my_strcpy(char* dest, const char* src)
//src中的內容不應被改變,加上const來保護
{
//assert防止出現指向NULL的指標
assert(dest != NULL);
assert(src != NULL);
//assert(dest && src);這種寫法也可以
char* p = dest;//記錄目標陣列的地址
while (*dest++ = *src++)
//遍歷src的每一個元素並拷貝
//'\0'的ASCII碼值為0
//當*src為'\0'時迴圈條件為假,退出迴圈
{
;
}
return p;
}
三、strcat
1.庫函式中的strcat
庫函式中的strcat是字元拼接函式
strcat(arr1, arr2);
表示將arr2中的內容拼接到arr1後面並返回arr1的地址。
用法如下:
int main()
{
char arr1[50] = "hello ";
char arr2[] = "world";
char* ret = strcat(arr1, arr2);
printf("%s\n", ret);
return 0;
}
2.模擬實現strcat
char* my_strcat(char* dest, const char* src);
思路:先找到dest後字串的’\0’,從該地址開始拷貝src後的字串
程式碼如下(示例):
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest)
{
dest++;
}
//此時dest是前一個字串'\0'的位置
//接下來拷貝src後的內容,與strcpy相同
while (*dest++ = *src++)
{
;
}
return ret;
}
四、strcmp
1.庫函式中的strcmp
strcmp(arr1, arr2);
從第一個字元起比較arr1和arr2的每一個字元的ASCII碼值(注意不是比較arr1和arr2的長度),若大於返回大於0的值,小於返回小於0的值,等於返回0。
用法如下:
int main()
{
int ret = strcmp("abq", "abcd");
printf("%d\n", ret);
return 0;
}
注:當兩個字串不相同時,庫中要求返回大於0、小於0的值,有些編譯器將其固定為1和-1。
2.模擬實現strcmp
思路:遍歷兩個字串的每一個元素,直到有不同的字元時停止
int my_strcmp(const char* str1, const char* str2)
//兩個字串都不應被修改,加const保護
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1 - *str2;
//str1 > str2返回大於0的值
//str1 < str2返回大於0的值
}