網站首頁 編程語言 正文
一、模擬實現strcpy函數
strcpy函數是字符串拷貝函數,就是將源字符串拷貝到目標空間中。
char * strcpy ( char * destination, const char * source );//庫函數中的聲明
將源(source)指向的c字符串復制到目標(destination)指向的數組中,包括終止的空字符(并在該點停止)。
為避免溢出,目標(destination)指向的數組的大小應足夠長,以包含與源相同的C字符串(包括終止的空字符),并且在內存中不應與源重疊。
在這里需要注意:
1、源字符串必須以 '\0' 結束。
2、會將源字符串中的 '\0' 拷貝到目標空間。
3、目標空間必須足夠大,以確保能存放源字符串。
4、目標空間必須可變。
下面就用my_strcpy來模擬實現stcpy函數。
#include <stdio.h>
#include <assert.h>//assert的頭文件
char* my_strcpy(char* dest,const char* src)//這里用const修飾所指向的源字符串,因為源字符串是
//常量字符串,不能被修改
{
char* ret = dest;
assert(dest);//斷言源字符串和目標空間都不能為空指針
assert(src);
while (*dest++ = *src++)//一個字符串一個字符串的拷貝,遇到'\0'結束
{
;
}
return ret;//返回目標空間的起始地址
}
int main()
{
char arr1[20] = { 0 };
char arr2[] = "hello";
printf("%s", my_strcnpy(arr1, arr2));
return 0;
}
以上是整個字符串的拷貝,如果我們不拷貝整個字符串,只拷貝字符串里面的幾個字符,我們可以怎么做呢?接下來我們來看看strncpy這個函數,這個函數可以實現只拷貝字符串里面的幾個字符。這個函數的模擬實現大體上跟strcpy函數是一樣的,只是這里有了長度限制,接下來用my_strncpy來模擬實現。
#include <stdio.h>
#include <assert.h>
char* my_strcnpy(char* dest, const char* src, size_t n)
{
char* ret = dest;
assert(dest);
assert(src);
int i = 0;
for (i = 0; i < n; i++)//要拷貝幾個字符,循環幾次
{
*dest++ = *src++;
}
return ret;
}
int main()
{
char arr1[20] = { 0 };
char arr2[] = "hello";
printf("%s", my_strcnpy(arr1, arr2, 3));//3就是我們要拷貝的字符串的大小,這里就相當于將前三個字符hel進行拷貝(這里也可以將整個字符串拷貝,只要知道大小)
return 0;
}
二、模擬實現strcat函數
strcat是連接字符串函數,它的作用是將源字符串附加到目標字符串。目標中終止的空字符被源字符串中的第一個字符覆蓋,空字符包含在由目標中的兩個字符串聯而成的新字符串的末尾。
char * strcat ( char * destination, const char * source );//庫函數中的聲明
在這里需要注意:
1、源字符串必須以 '\0' 結束,目的地也必須以 '\0' 結束
2、目標空間必須有足夠的大,能容納下源字符串的內容。
3、目標空間必須可修改。
下面就用my_strcat來模擬實現strcat函數。
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, const char* src)這里用const修飾所指向的源字符串,因為源字符串是
//常量字符串,不能被修改
{
char* ret = dest;
assert(dest);
assert(src);
while (*dest != '\0')\\找到目標空間的結束標志處,然后開始連接
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;//返回目標空間的起始地址
}
int main()
{
char arr1[20] = "abc";
char arr2[] = "def";
printf("%s\n", my_strncat(arr1, arr2));
return 0;
}
對于字符串連接還有一個函數strncat也能描述,但是這個函數是有長度限制的,可以連接一個字符串里面的幾個字符或者整個字符串。下面就用my_strncat來模擬實現strcat函數。
#include <stdio.h>
#include <assert.h>
char* my_strncat(char* dest, const char* src,size_t n)
{
char* ret = dest;
assert(dest);
assert(src);
int i = 0;
while (*dest != '\0')\\找到目標空間的結束標志處,然后開始連接
{
dest++;
}
for (i = 0; i < n; i++)//要連接幾個字符,循環幾次
{
*dest++ = *src++;
}
return ret;//返回目標空間的起始地址
}
int main()
{
char arr1[20] = "abc";
char arr2[] = "def";
printf("%s\n", my_strncat(arr1, arr2, 2));//需要連接幾個字符串,就將它們的大小傳過去,這里這里的2就是字符串里面"de"的大小,將"de"兩個字符傳過去
return 0;
}
三、模擬實現strcmp函數
strcmp是字符串比較函數,比較兩個字符串str1和str2,此函數開始比較每個字符串的第一個字符。如果它們彼此相等,則繼續往下比,直到字符不同或到達終止的空字符。
int strcmp ( const char * str1, const char * str2 );//庫函數中的聲明
第一個字符串大于第二個字符串,則返回大于0的數字
第一個字符串等于第二個字符串,則返回0
第一個字符串小于第二個字符串,則返回小于0的數字
下面用my_strcmp來模擬實現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,說明這兩個字符串相等
{
return 0;
}
else//如果沒有比完,繼續往下一個比
{
str1++;
str2++;
}
}
//如果兩個字符不相等,那就比大小,返回大于0的數則說明str1>str2,反之小于。
return *str1 - *str2;
}
int main()
{
char arr1[20] = "abcefg";
char arr2[] = "efghij";
int ret = my_strcmp(arr1, arr2);
if (ret > 0)
{
printf("大于\n");
}
else if (ret < 0)
{
printf("小于\n");
}
else
{
printf("等于\n");
}
return 0;
}
有長度限制的比較函數strncmp,下面用my_strncmp模擬實現:
#include <stdio.h>
#include <assert.h>
int my_strncmp(const char* str1, const char* str2,int n)
{
int i = 0;
for (i = 0; i < n; i++)//需要比較幾個字符循環幾次
{
if (*(str1 + i) == *(str2 + i))//先看首字符如果這兩個字符是否相等,如果相等繼續往下比,不相等跳出去比較大小
{
if (*str1 == '\0')//判斷是否已經比完了所有字符,如果已經比完了返回0,說明這兩個字符串相等
{
return 0;
}
else//如果沒有比完,繼續往下一個比
str1++;
str2++;
}
//如果兩個字符不相等,那就比大小,返回大于0的數則說明str1>str2,反之小于。
return *str1-*str2;
}
}
int main()
{
char arr1[20] = "abcefg";
char arr2[] = "efghij";
int ret = my_strncmp(arr1, arr2,2);
if (ret > 0)
{
printf("大于\n");
}
else if (ret < 0)
{
printf("小于\n");
}
else
{
printf("等于\n");
}
return 0;
}
四、小結
以上就是字符串的庫函數的模擬實現。主要講了一種是長度不受限制的字符串函數(strcpy,strcat,strcmp),一種是長度受限制(strncpy,strncat,strncmp)的字符串函數。
原文鏈接:https://blog.csdn.net/m0_65673419/article/details/124084093
相關推薦
- 2024-03-04 css鼠標移動上去才顯示滾動條
- 2023-07-04 Guava 之 EventBus
- 2022-04-09 Windows 環境配置Github 的SSH key
- 2022-12-21 iOS開發學習TableView展現一個list實例_IOS
- 2022-11-08 PostgreSQL?pg_filenode.map文件介紹_PostgreSQL
- 2022-07-31 C語言算法積累加tag的循環隊列_C 語言
- 2024-01-12 com.fasterxml.jackson.databind.exc.InvalidDefiniti
- 2022-08-10 .Net通過TaskFactory.FromAsync簡化APM_實用技巧
- 最近更新
-
- 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同步修改后的遠程分支