日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

如何寫一個自己的strcpy函數

作者:c鐵柱同學 更新時間: 2022-02-13 編程語言

我們在學習數組內容的時候知道,要想把一個數組賦給另一個數組,我們不能像給變量賦值那樣直接用等號(=),而是需要用到一個庫函數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

欄目分類
最近更新