天天看點

字元串拷貝函數:strcpy的詳解及模拟實作

字元串拷貝函數:strcpy的詳解及模拟實作!!!

對于字元串拷貝函數,之前在學習字元串時候,就已經學習過,但那隻是片面的學習了一下,并沒有經過系統的分析!隻是大概的學習了一下!在關鍵的地方有時候還不知道該怎麼用!是以出現學習跟沒有學一樣的效率!是以,筆者最近再次系統的學習了一下:是以才打算發一篇文章:  字元串拷貝函數:strcpy的詳解及模拟實作 !來與大家共勉!

首先對于字元串拷貝函數:strcpy 我們需要知道:

char* strcpy(char* destination ,const char* source)
           

上述的代碼是指:在strcpy函數使用的時候,需要注意的格式問題!!對于destination 是指 :目的地  ,  source  是指:源頭!!該片段的總體意思是:将源頭拷貝到目的地!

對于本文的學習之前,需要知道一下知識儲備!:

1.源字元串必須以'\0'結尾!

2.strcpy字元串拷貝函數:會将源字元串中的'\0'拷貝到目标空間!

3.目标空間必須足夠大,以確定能存放源字元串!!

4.目标空間必須可變!(不能被const修飾)!

5.要學會strcpy字元串拷貝函數的模拟實作!

對于strcpy字元串拷貝函數!我們先做一下知識儲備:

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[10] = { 0 };
	const char* p = "abcdef";
	strcpy(arr, p);
	printf("%s\n", arr);
	return 0;
}
           

這段代碼就是對于:strcpy字元串拷貝函數的簡單實作!!想必大家也都能看懂!

代碼的運作結果為:

字元串拷貝函數:strcpy的詳解及模拟實作

 但是對于:const char* p = "abcdef";中的'\0'要不要拷貝到arr[10]裡面去??心存疑惑!!

是以,我們可以将arr[10]數組進行初始化為:arr[10]="xxxxxxxxx"!!這樣操作,加上調試,更能直覺的看出來!

是以更改後的代碼為:雖然結果也是一樣的,但是在調試的過程中,可以顯現出來:strcpy字元串拷貝函數:會将源字元串中的'\0'拷貝到目标空間!

字元串拷貝函數:strcpy的詳解及模拟實作

 代碼調試前的結果為:

字元串拷貝函數:strcpy的詳解及模拟實作

請注意:arr[10]數組裡面值的變化!

代碼調試完成以後的結果為:

字元串拷貝函數:strcpy的詳解及模拟實作

 綜上代碼的調試結果所述:strcpy字元串拷貝函數:會将源字元串中的'\0'拷貝到目标空間!

但是,在使用strcpy拷貝字元串中,必須要知道'\0‘所在的位置:是以,對于字元數組的拷貝就會出現問題!!請看下列代碼::

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[10] = "xxxxxxxxx";
	char arr2[] = { 'a','b','c' };
	strcpy(arr, arr2);
	printf("%s\n", arr);
	return 0;
}
           

 對于上述的代碼中:由于在字元數組中:'\0'的位置并不知道,導緻越界通路,是以會出現錯誤!!

請看代碼的運作結果:

字元串拷貝函數:strcpy的詳解及模拟實作

對于上述的出現錯誤的代碼,筆者就不再進行調試了!請各位老鐵可以了解一下!!

但是,當使用字元數組進行strcpy進行拷貝時候,手動放置一個'\0'!也可以進行正常的拷貝使用!!

字元串拷貝函數:strcpy的詳解及模拟實作

 在這個代碼中,拷貝的時候,也會将'\0'進行拷貝!!對于此問題,我們依然 可以通過調試來進行分析!

在調試完成之前的:

字元串拷貝函數:strcpy的詳解及模拟實作

 調試完成之後:

字元串拷貝函數:strcpy的詳解及模拟實作

在上述的調試結果中:我們可以清晰地看出來!在字元數組中,手動放置的'\0'也會進行拷貝!!

結合以往經驗,筆者苦心專研了兩個錯誤寫法,下面請筆者……看一下代碼:

1.目标空間必須足夠大,以確定能存放源字元串!!否則,将會出現崩潰現象!!錯誤示範,請忽模仿

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[3] = { 0 };
	char arr2[] = "abcdef";
	strcpy(arr, arr2);
	printf("%s\n", arr);
	return 0;
}
           

代碼的運作結果為:

字元串拷貝函數:strcpy的詳解及模拟實作

 程式崩潰!!

2.目标空間必須可變!(不能被const修飾,常量字元串不可被修改)!錯誤示範,請忽模仿

#include <stdio.h>
#include <string.h>
int main()
{
	char* p = "hello world";
	char arr2[] = "abcdef";
	strcpy(p, arr2);
	printf("%s\n", p);
	return 0;
}
           

 該段代碼的運作結果為:

字元串拷貝函數:strcpy的詳解及模拟實作

 直接出現錯誤,不能被更改!!

上面兩個是筆者之前專研的!!對于其他的bug若是讀者有不同的想法,請私聊筆者喲!

下面筆者進行對strcpy字元串拷貝函數的模拟實作!!!也到了該拿出壓箱底的實力了!!

請看筆者代碼:

#include <stdio.h>
#include <string.h>
#include <assert.h>

char* my_strcpy(char* dest, const char* src)
{
	assert(dest);
	assert(src);
	char* ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

int main()
{
	char arr1[20] = "abc";
	char arr2[] = "hello wang";
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}
           

對于上述代碼中:

1.    assert(dest);   assert(src);  斷言,因為在後面的文章中,對dest 與src都進行了解引用操作,是以在使用之前要確定不是空指針!!

2.在while循環裡面,為什麼是:*dest++ = *src++  而不是:*dest=*src;  dest++; src++;呢 ???其實主要的原因還是在于拷貝'\0'的問題,當while 循環裡面判斷出來是'\0'則會進行跳出,不會拷貝'\0';是以進行了上述while循環裡面的操作!!實作先指派在判斷!!

3.為什麼在最後的傳回值是:return ret;????而不是 return  dest;??? 原因在于:随着dest++與src++的指派,dest早已不再指向起始位置!!

代碼的運作結果為:

字元串拷貝函數:strcpy的詳解及模拟實作

上述就是筆者對該strcpy字元串拷貝函數的模拟實作的解析,若有不懂得老鐵,請私聊筆者喲!!

繼續閱讀