C語(yǔ)言字符串函數(shù)模擬實(shí)現(xiàn)流程介紹
該文章將簡(jiǎn)易模擬實(shí)現(xiàn)strlen、strcpy、strcat、strcmp、strstr。那么讓我們廢話(huà)少說(shuō),直接開(kāi)始吧。
一、strlen
strlen-Get string length.即獲取字符串長(zhǎng)度。函數(shù)參數(shù)為 const char* str,函數(shù)返回類(lèi)型為 size_t。如下圖所示:

strlen函數(shù)的讀取結(jié)束標(biāo)志為’\0’,因此,若字符串中沒(méi)有’\0’,字符串長(zhǎng)度則為隨機(jī)值。
下面將以三種方式模擬實(shí)現(xiàn)strlen函數(shù),函數(shù)將命名為 my_strlen。
1.使用計(jì)數(shù)器
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)
{
assert(str);//斷言一下傳過(guò)來(lái)的參數(shù)是否為空指針
size_t count = 0;//設(shè)置一個(gè)計(jì)數(shù)器
while (*str++)
{
count++;
}
return count;
}
int main()
{
char arr[] = "hello world!";
int ret = my_strlen(arr);
printf("%d\n", ret);
return 0;
}
顯示結(jié)果:

該方法為設(shè)置一個(gè)計(jì)數(shù)器變量 count,讓計(jì)數(shù)器在指針每增加一個(gè)字節(jié)時(shí)自增一,當(dāng) *str 為’\0’時(shí),循環(huán)結(jié)束,返回的count就是字符串長(zhǎng)度。
2.使用函數(shù)遞歸
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)
{
assert(str);
if (*str != '\0')
return 1 + my_strlen(str + 1);
else
return 0;
}
int main()
{
char arr[] = "hello world!";
int ret = my_strlen(arr);
printf("%d\n", ret);
return 0;
}
顯示結(jié)果:

3.使用指針-指針
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)
{
assert(str);
const char* start = str;
const char* end = str;
while (*end != '\0')
{
end++;
}
return end - start;
}
int main()
{
char arr[] = "hello world!";
int ret = my_strlen(arr);
printf("%d\n", ret);
return 0;
}
顯示結(jié)果:

二、strcpy
strcpy-Copy string.即拷貝字符串。函數(shù)參數(shù)為 char* dest 和 const char* scr,函數(shù)返回類(lèi)型為 char*。如下圖所示:

源字符串必須以’\0’結(jié)束,目標(biāo)字符串會(huì)將’\0’一同拷貝
下面將模擬實(shí)現(xiàn)strcpy,函數(shù)命名為my_strcpy
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* scr)
{
assert(dest);
assert(scr);
char* start = dest;//記錄目標(biāo)指針的起始位置
while (*dest++ = *scr++)
{
;
}
return start;
}
int main()
{
char arr1[20] = "xxxxxxxxxxxxxxxxxxx";
char arr2[] = "hello world!";
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}
顯示結(jié)果:

三、strcat
strcat-Concatenate strings.即連接字符串。函數(shù)參數(shù)為 char* dest 和 const char* scr,函數(shù)返回類(lèi)型為 char*。如下圖所示:

源字符串必須以’\0’結(jié)束,否則程序?qū)⒈罎ⅰ?/p>
下面將模擬實(shí)現(xiàn)strcat,函數(shù)命名為my_strcat
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, const char* scr)
{
assert(dest);
assert(scr);
char* start = dest;
while (*dest != '\0')
{
dest++;//先將目標(biāo)指針遍歷到'\0'的位置上
}
while (*dest++ = *scr++)
{
;
}
return start;
}
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world!";
printf("%s\n", my_strcat(arr1, arr2));
return 0;
}顯示結(jié)果:

四、strcmp
strcmp-Concatenate strings.即比較兩個(gè)字符串。函數(shù)參數(shù)為 const char* str1 和 const char* str2,函數(shù)返回類(lèi)型為 int。如下圖所示:

標(biāo)準(zhǔn)規(guī)定:
1. str1>str2,返回值>0
2. str1==str2,返回值=0
3. str1<str2,返回值<0
下面將模擬實(shí)現(xiàn)strcmp,函數(shù)命名為my_strcmp
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* str1, const char* str2)
{
assert(str1);
assert(str2);
while (*str1 == *str2)
{
if (*str1 != '\0')//兩個(gè)字符串對(duì)應(yīng)元素相等并都不為'\0'時(shí),遍歷這個(gè)字符串
{
str1++;
str2++;
}
else
return 0;//此為直到兩個(gè)字符串結(jié)束都相等,所以返回0
}
return *str1 - *str2;//不相等時(shí)返回兩個(gè)字符串對(duì)應(yīng)元素的差值即可判斷大小。
}
int main()
{
char arr1[] = "abc";
char arr2[] = "abcd";
int ret = my_strcmp(arr1, arr2);
if (ret > 0)
{
printf("arr1>arr2\n");
}
else if (ret < 0)
{
printf("arr1<arr2\n");
}
else
printf("arr1==arr2\n");
return 0;
}
顯示結(jié)果:

到此這篇關(guān)于C語(yǔ)言字符串函數(shù)模擬實(shí)現(xiàn)流程介紹的文章就介紹到這了,更多相關(guān)C語(yǔ)言字符串函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語(yǔ)言字符串函數(shù),字符函數(shù),內(nèi)存函數(shù)使用及模擬實(shí)現(xiàn)
- C語(yǔ)言中關(guān)于計(jì)算字符串長(zhǎng)度的幾種方式
- C語(yǔ)言中的字符串?dāng)?shù)據(jù)在C中的存儲(chǔ)方式
- C語(yǔ)言超全面講解字符串函數(shù)
- 一波C語(yǔ)言字符數(shù)組實(shí)用技巧集錦
- 淺析C語(yǔ)言中的數(shù)組及字符數(shù)組
- C語(yǔ)言之從字符數(shù)組中刪除特定的字符
- c語(yǔ)言字符數(shù)組與字符串的使用詳解
- C語(yǔ)言字符串與字符數(shù)組面試題中最易錯(cuò)考點(diǎn)詳解
相關(guān)文章
Vscode中接入Deepseek的實(shí)現(xiàn)
本文主要介紹了Vscode中接入Deepseek的實(shí)現(xiàn),包括登錄Deepseek官網(wǎng)、申請(qǐng)APIKEY、安裝和配置VSCode插件,具有一定的參考價(jià)值,感興趣的可以了解一下2025-02-02
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列的相互實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言相互實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-07-07
基于C++語(yǔ)言實(shí)現(xiàn)機(jī)動(dòng)車(chē)違章處罰管理系統(tǒng)
這篇文章主要介紹了基于C++語(yǔ)言實(shí)現(xiàn)機(jī)動(dòng)車(chē)違章處罰管理系統(tǒng)的相關(guān)資料,需要的朋友可以參考下2016-07-07
C?語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲完整示例代碼
這篇文章主要介紹了如何使用C語(yǔ)言生成1到100之間的隨機(jī)數(shù),并提供了一個(gè)簡(jiǎn)單的猜數(shù)字游戲的實(shí)現(xiàn)代碼,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03
c語(yǔ)言實(shí)現(xiàn)冒泡排序、希爾排序等多種算法示例
c語(yǔ)言實(shí)現(xiàn)插入排序、冒泡排序、選擇排序、快速排序、堆排序、歸并排序、希爾排序示例,需要的朋友可以參考下2014-04-04
詳解C++調(diào)用Python腳本中的函數(shù)的實(shí)例代碼
這篇文章主要介紹了C++調(diào)用Python腳本中的函數(shù) ,需要的朋友可以參考下2018-11-11
淺析char 指針變量char *=p 這個(gè)語(yǔ)句的輸出問(wèn)題
下面小編就為大家?guī)?lái)一篇淺析char 指針變量char *=p 這個(gè)語(yǔ)句的輸出問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05

