網站首頁 編程語言 正文
我們在學習數組內容的時候知道,要想把一個數組賦給另一個數組,我們不能像給變量賦值那樣直接用等號(=),而是需要用到一個庫函數strcpy,那么我們可不可以自己寫一個函數,來實現它的功能呢,我們往下看。
這是在www.cplusplus.com上對strcpy這個函數的一些介紹,我們看到,要寫這樣一個函數,我們首先需要傳給他兩個地址,然后這個函數實現把surce指向的字符串賦給destnation,完成字符串的交換。
那我們在寫我們自己的函數時,可以計劃,我們把被復制的字符串定義為src,把要被賦值的那個字符串定義為dest,我們知道數組的名字是數組第一個元素的地址,那么我們可以就從第一個元素開始,然后一個一個的把src的元素賦給dest,包括‘\0’,因為不管dest之前的元素有多長,只要我們把‘\0’也賦值進來,那么在'\0'后面的值就沒有效果了,即完成了字符串的復制,下面我們就著手來寫代碼。
?
?在這個代碼中,我們使用了一個while循環,我們對src指向的元素是不是‘\0’進行了一個判斷,如果不是,那么就對字符串進行賦值,然后移動指針,直到指針指到scr的'\0'為止,然后我們再單獨把這個‘\0’賦給dest,這樣我們就完成了字符串的賦值。
上面的代碼雖然完成了拷貝字符串的任務,但是不夠美麗,我們來對她進行一點小小的修改。
?
?我們發現,我們把while循環中的賦值語句放到了while循環中的判斷部分,同樣達到了我們的目的,那么這是怎么回事呢,我們來分析一下。
首先我們知道這兩個指針的++是后置的,后置++的意思就是我們先使用這兩個指針,然后再進行遞加,在我們沒有指到‘\0’這個元素之前,src指到的都是字符,那么這些字符的ASCII值都是非0,那就代表這個賦值語句的值也是非0,它在循環語句的判斷部分時就代表這次判斷為真,那么當我們一直賦值,直到src指到了‘\0’,這時候賦值的內容就是把'\0'賦值給dest,而‘\0’的ASCII值就是0,也就代表了整個賦值表達式的值為0,判斷條件為假,跳出循環,以此我們就完成了拷貝字符串的目的。
現在我們拷貝字符串的任務雖然完成了,但是我們考慮到,萬一在傳參的時候,我們傳進來的指針是一個空指針怎么辦,我們是無法對指針進行訪問的,所以我們就要避免這樣的情況,那么我們就可以用if語句對傳來的兩個參數進行判斷,代碼如下。
??當我們發現我們傳進去的有空指針時,就會直接跳出來,這里我們雖然完成了對輸入內容的篩選,但是我們每次調用時都要進入這個if語句進行判斷,那么我們有沒有方法讓這個代碼更加美麗一些呢,答案是有的,我們可以使用assres
assert--斷言--頭文件為<assert.h>
assert()的作用就是當括號里的內容為真時,什么都不發生,當內容為假時,就會報錯,我們使用assert來改善一下我們的代碼
?當我們再傳入空指針時,代碼就會報錯,并且告訴我們錯誤的位置,非常貼心
?傳參正常時,則代碼正常運行,什么都不發生。
這時候我們的代碼就大概完成了,但是我們回來看strcpy的定義時發現,函數的運行完成后會返回一個char*類型的地址,是destnation的地址,并且在形參source前面用了一個const來修飾,在常量變量的時候我們學到過有一種常量叫const修飾的常變量,即被const修飾的變量就具備了常量的屬性,值不能被改變,所以在source前面用const修飾它的意義就是來保護這個地址,因為他是我們被賦值的那個字符串,我們不希望它的內容被改變,所以用const來保護它,那么我們在我們的scr前也用const來修飾一下就好,至于返回值的問題,我們只需要在進行交換之前,把dest的地址備份一些,交換完成后返回就好了。
?以上我們就成功的寫出了一個自己的字符串拷貝函數,下面是這個函數的代碼。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest,const char* src)
{
char* ret = dest;
assert(dest != NULL);
assert(src != NULL);
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[] = { "abcdef" };
char arr2[20] = { "XXXXXXXXXXXXXXXX" };
my_strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
如果大家覺得我的文章對你有幫助,希望能夠給我點贊支持一下,鐵柱在這里謝謝大家了
原文鏈接:https://blog.csdn.net/qq_45967533/article/details/122851628
相關推薦
- 2023-01-15 SqlServer?多種分頁方式?詳解(含簡單速度測試)_MsSql
- 2023-01-23 React中props使用介紹_React
- 2022-07-29 Android錄音功能的實現以及踩坑實戰記錄_Android
- 2022-09-21 .NET中求復雜類型集合的差集、交集、并集_實用技巧
- 2022-05-10 @requestMapping注解的常用參數
- 2022-07-25 Python實現文件及文件夾操作大全_python
- 2022-07-07 C++實現數組中元素組合出最大值_C 語言
- 2022-03-06 css3溢出隱藏的方法_基礎教程
- 最近更新
-
- 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同步修改后的遠程分支