人類高質量男性不好當?那就來寫人類高質量代碼!
- 前言
- 一、一個簡單的例子(模擬實作strcpy函式)
- 1.strcpy函式介紹
- 2.模擬實作strcpy函式
- 二、高質量(優化)部分
- 1.對于源頭陣列的思考
- 2.對于回圈體的思考
- 3.對于函式回傳值的思考(鏈式訪問)
- 4.對于空指標的思考
- 總結
前言
眾所周知,想要成人類高質量男性是十分不容易的,但這是一個大目標,一口是不能吃成大胖子的,那么我們可以將目標分為一個個小目標,(咳咳)比如先賺他一個億 ,作為碼農,想要成為人類高質量的程式員,那么你寫出來的也必須經過優化,使得代碼運行的效率更高,那么今天就來教學一波如何寫出高質量代碼,為你成為人類高質量碼農的道路上添磚加瓦!

一、一個簡單的例子(模擬實作strcpy函式)
1.strcpy函式介紹
相信各位都知道strcpy函式,如果不知道的話,建議紫砂謝罪 ,那么我來簡單介紹一下函式:
strcpy函式:
- 原型宣告:char strcpy(char dest, const char *src);
- 頭檔案:#include <string.h> 和 #include <stdio.h>
- 功能:把從src地址開始且含有NULL結束符的字串復制到以dest開始的地址空間
- 說明:src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納src的字串,
2.模擬實作strcpy函式
那么如果我們想要實作一個strcpy函式該怎么做呢?

代碼示例:
#include<stdio.h>
void my_strcpy(char* dest, char* src)
{
while (*src!='\0')
{
*dest = *src;
*dest++;
*src++;
}
*dest = *src;//將'\0'也賦入arr1,防止出現arr1陣列的內容
}
int main()
{
//定義兩個陣列
char arr1[] = "###############";
char arr2[] = "人類高質量男性";
my_strcpy(arr1,arr2);
printf("%s\n", arr1);
}
這里我們定義了兩個陣列,我們想要將arr2陣列拷貝進arr1,那么我們寫一個my_strcpy函式,這里使用了傳址呼叫,字符指標dest表示目標地址,字符指標src表示源頭地址,使用回圈來遍歷陣列,如果源頭地址src不等于0(也就是何時拷貝完畢),將源地址的值賦給目標地址,來達到傳值的效果,地址++,一個一個地址的賦值改變,
那么我們就這樣完成了一個簡單的strcpy函式,
二、高質量(優化)部分
很明顯我們剛剛寫出來的代碼比較低質量,代碼還存在許多問題我們沒有考慮到,那么我們現在可以如何提高自身代碼的質量,
1.對于源頭陣列的思考
觀察代碼,我們可以發現陣列arr2是不可改變的,那么我們就可以使用const關鍵字對其進行修飾,來防止它發生變化,防止資料發生變化,那么函式體就可以寫為:
char arr2[] = "人類高質量男性";
代碼示例:
void my_strcpy(char* dest,const char* src)
{
while (*src!='\0')
{
*dest = *src;
*dest++;
*src++;
}
*dest = *src;//將'\0'也賦入arr1
}
2.對于回圈體的思考
我們很明顯可以看出回圈體里面的內容是否過于冗余,代碼過于臃腫,那么進行優化
代碼示例:
void my_strcpy(char* dest,const char* src)
{
//先賦值再++
//當遇到'\0'回圈結束
while (*dest++ = *src++)
{
;
}
}
3.對于函式回傳值的思考(鏈式訪問)
當我們查看strcpy函式定義時,我們可以發現strcpy其實是有回傳值的,但我們這里沒有寫,那么當列印時發生的鏈式訪問就無法運行,
例如:
printf("%s\n", my_strcpy(arr1, arr2));
此時代碼就無法很好的運行,那么可以讓函式回傳值應該為char*,這樣我們的鏈式訪問也能安全進行,我們定義一個指標變數,來儲存dest的地址(dest地址會改變,所以ret存盤dest初始值),并且回傳從而來列印arr1,
代碼示例:
char* my_strcpy(char* dest,const char* src)
{
char* ret = dest;//定義一個指標變數,來儲存dest的地址,來列印arr1
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[] = "################";
char arr2[] = "人類高質量男性";
//把'\0'也列印了
//如果傳遞空指標就會崩潰,所以加上斷言
printf("%s\n", my_strcpy(arr1, arr2));//回傳值有助于鏈式訪問
}*/
4.對于空指標的思考
如果我們傳遞了一個空指標怎么辦?
那么我們可以使用assert(斷言)函式來判斷傳遞的指標是否為空指標,這里就要用到#include<assert.h>頭檔案了,
使用斷言來判斷指標是否為空指標,當為空指標時就會報錯,
代碼如下:
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest,const char* src)
{
assert(dest != NULL);//斷言
assert(src != NULL);//斷言
char* ret = dest;//定義一個指標變數,來儲存dest的地址,來列印arr1
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[] = "################";
char arr2[] = "人類高質量男性";
printf("%s\n", my_strcpy(arr1, arr2));//回傳值有助于鏈式訪問
}
運行:

當以上問題解決時,我們就寫出了較高質量的代碼,離人類高質量男性又進了一步!

總結
當我們寫代碼時,即使程式運行出來了,我們依舊不能掉以輕心,要多方位思考,不斷優化,使得代碼更加安全,這樣我們就朝著人類高質量男性更進一步,共勉!
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest,const char* src)
{
assert(dest != NULL);//斷言
assert(src != NULL);//斷言
char* ret = dest;//定義一個指標變數,來儲存dest的地址,來列印arr1
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[] = "################";
char arr2[] = "人類高質量男性";
printf("%s\n", my_strcpy(arr1, arr2));//回傳值有助于鏈式訪問
}
作者水平有限,文章若有錯誤,還望指正,萬分感激!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/292228.html
標籤:其他
