字元串拷貝函數: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字元串拷貝函數的簡單實作!!想必大家也都能看懂!
代碼的運作結果為:
但是對于:const char* p = "abcdef";中的'\0'要不要拷貝到arr[10]裡面去??心存疑惑!!
是以,我們可以将arr[10]數組進行初始化為:arr[10]="xxxxxxxxx"!!這樣操作,加上調試,更能直覺的看出來!
是以更改後的代碼為:雖然結果也是一樣的,但是在調試的過程中,可以顯現出來:strcpy字元串拷貝函數:會将源字元串中的'\0'拷貝到目标空間!
代碼調試前的結果為:
請注意:arr[10]數組裡面值的變化!
代碼調試完成以後的結果為:
綜上代碼的調試結果所述: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進行拷貝時候,手動放置一個'\0'!也可以進行正常的拷貝使用!!
在這個代碼中,拷貝的時候,也會将'\0'進行拷貝!!對于此問題,我們依然 可以通過調試來進行分析!
在調試完成之前的:
調試完成之後:
在上述的調試結果中:我們可以清晰地看出來!在字元數組中,手動放置的'\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;
}
代碼的運作結果為:
程式崩潰!!
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;
}
該段代碼的運作結果為:
直接出現錯誤,不能被更改!!
上面兩個是筆者之前專研的!!對于其他的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字元串拷貝函數的模拟實作的解析,若有不懂得老鐵,請私聊筆者喲!!