網站首頁 編程語言 正文
該文章將簡易模擬實現strlen、strcpy、strcat、strcmp、strstr。那么讓我們廢話少說,直接開始吧。
一、strlen
strlen-Get string length.即獲取字符串長度。函數參數為 const char* str,函數返回類型為 size_t。如下圖所示:
strlen函數的讀取結束標志為’\0’,因此,若字符串中沒有’\0’,字符串長度則為隨機值。
下面將以三種方式模擬實現strlen函數,函數將命名為 my_strlen。
1.使用計數器
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)
{
assert(str);//斷言一下傳過來的參數是否為空指針
size_t count = 0;//設置一個計數器
while (*str++)
{
count++;
}
return count;
}
int main()
{
char arr[] = "hello world!";
int ret = my_strlen(arr);
printf("%d\n", ret);
return 0;
}
顯示結果:
該方法為設置一個計數器變量 count,讓計數器在指針每增加一個字節時自增一,當 *str 為’\0’時,循環結束,返回的count就是字符串長度。
2.使用函數遞歸
#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;
}
顯示結果:
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;
}
顯示結果:
二、strcpy
strcpy-Copy string.即拷貝字符串。函數參數為 char* dest 和 const char* scr,函數返回類型為 char*。如下圖所示:
源字符串必須以’\0’結束,目標字符串會將’\0’一同拷貝
下面將模擬實現strcpy,函數命名為my_strcpy
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* scr)
{
assert(dest);
assert(scr);
char* start = dest;//記錄目標指針的起始位置
while (*dest++ = *scr++)
{
;
}
return start;
}
int main()
{
char arr1[20] = "xxxxxxxxxxxxxxxxxxx";
char arr2[] = "hello world!";
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}
顯示結果:
三、strcat
strcat-Concatenate strings.即連接字符串。函數參數為 char* dest 和 const char* scr,函數返回類型為 char*。如下圖所示:
源字符串必須以’\0’結束,否則程序將崩潰。
下面將模擬實現strcat,函數命名為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++;//先將目標指針遍歷到'\0'的位置上
}
while (*dest++ = *scr++)
{
;
}
return start;
}
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world!";
printf("%s\n", my_strcat(arr1, arr2));
return 0;
}
顯示結果:
四、strcmp
strcmp-Concatenate strings.即比較兩個字符串。函數參數為 const char* str1 和 const char* str2,函數返回類型為 int。如下圖所示:
標準規定:
1. str1>str2,返回值>0
2. str1==str2,返回值=0
3. str1<str2,返回值<0
下面將模擬實現strcmp,函數命名為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')//兩個字符串對應元素相等并都不為'\0'時,遍歷這個字符串
{
str1++;
str2++;
}
else
return 0;//此為直到兩個字符串結束都相等,所以返回0
}
return *str1 - *str2;//不相等時返回兩個字符串對應元素的差值即可判斷大小。
}
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;
}
顯示結果:
原文鏈接:https://blog.csdn.net/yishaobai/article/details/126839912
相關推薦
- 2022-04-05 ORA-01779: 無法修改與非鍵值保存表對應的列
- 2023-04-24 一文帶你深入了解C++中音頻PCM數據_C 語言
- 2022-08-11 C++超詳細講解強制類型轉換的用法_C 語言
- 2022-10-22 python?中的?super詳解_python
- 2023-01-21 C++實現逆波蘭表達式的例題詳解_C 語言
- 2023-11-26 XMLHttpRequest的readyState狀態值
- 2022-12-15 python將二維數組升為一維數組或二維降為一維方法實例_python
- 2023-07-29 修改(elementui)el-table底層背景色
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支