程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> strcpy()的實現,strcpy()實現

strcpy()的實現,strcpy()實現

編輯:關於C語言

strcpy()的實現,strcpy()實現


看到有一個博客講的比平時理解的更深入,mark一下:strcpy函數的實現

 

這裡只寫平時理解的,三個要點:

 1 //strcpy自己實現
 2 
 3 char *strcpy(char *dest, const char *src)
 4 {
 5     assert(dest != NULL && src != NULL);  //判斷參數的合法性
 6     char *ret = dest;                            //記錄原目標地址,用於返回
 7     while( (*dest++ = *src++) != '\0' )    //先拷貝數據,再判斷是否結束
 8         ;
 9     return ret;
10 }

 

為什麼要返回char *類型?

答:能夠支持鏈式表達式,比如int len = strlen(strcpy(strA, strB));


strcpy原型怎才可以實現?

char *strcpy(char *strDest, const char *strSrc);//第二個參數設置為常量 是不想在函數中間 讓其發生改變
{
assert((strDest!=NULL) && (strSrc !=NULL)); // 這句是斷言 判斷不該出現的錯誤
//如果出現作物 立即在這裡停止
char *address = strDest;//創建一個地址指針 用於返回
while( (*strDest++ = * strSrc++) != ‘\0’ ) // 2分
//這句比較復雜
//(*strDest++ = * strSrc++) 這個是逐位賦值
而每次賦值之後 用*strDest!='/0'進行比較作為循環條件結束 也就是 strSrc已經復制到結束了
return address ;//最後返回
}
 

strcpy的實現

主函數和strcpy中的memset(dest, 0, sizeof(dest));
這句話有問題;
因為char* dest未指向任何變量,長度不確定,那麼這樣分配的內存也是大小不確定的,所以有可能訪問了為分配單元。

可以寫成memset(dest,0,sizeof(src));這句話是分dest與src一樣大小的單元。因為在strcpy中傳入src時,或則是主函數中的src都是已知大小的
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved