strcpy與memcpy兩函式的經典實現,哈哈,不過,不是偶寫的!^_^…………
char *strcpy(char *des, const char *src)
void *memcpy(void *pvto, const void *pvfrom, size_t size)
經典試題:
已知strcpy函式的原型是
char* strcpy(char* strdest,const char* strsrc);
1.不呼叫庫函式,實現strcpy函式
2.解釋為什麼要返回char*;
1.strcpy的實現**
char* strcpy(char* strdest,const char* strsrc)
[1](a)不檢查指標的有效性,說明設計者不注重程式的健壯性
(b)檢查指標的有效性時使用((!strdest) || (!strsrc))或(!(strdest && strsrc)),說明對c語言中
型別隱式轉換沒有深刻認識,在本例中char*轉換為bool即是型別隱式轉換,這種功能雖然靈活,但
是更多的是導致出錯概率的增大和維護成本的增高
(c)檢查指標的有效性時使用((strdest==0)||(strsrc==0))說明答題者不知道使用常量的好處。直接使用字面常量(如本例中的0)會減少程式的可維護性。0雖然簡單,但程式中可能出現很多處對指標的檢查,萬一出現筆誤,編譯器不能發現,生成的程式內含邏輯錯誤,很難排除。而使用null代替0,如果出現拼寫錯誤,編譯器就會檢查出來。
[2](a)return new string("invalid arguments");,說明答題者根本不知道返回值得用途,並且它對記憶體洩露也沒有警惕心,從函式體中返回函式體內分配的記憶體是十分危險的做法,他把釋放記憶體的義務拋給不知情的呼叫者,絕大多數情況下,呼叫者不會釋放記憶體,這導致記憶體洩露
(b)return 0;,說明答題者沒有掌握異常機制。呼叫者有可能忘記檢查返回值,呼叫者還可能無法檢查返回值(見後面的鏈式表示式)。妄想讓返回值肩負返回正確值和異常值的雙重功能,其結果往往是兩種功能都失效。應該以丟擲異常來代替返回值,這樣可以減輕呼叫者的負擔、使錯誤不會被忽略、增強程式的可維護性。
[3](a)忘記儲存原始的strdest值,說明答題者邏輯思維不嚴密。
[4](a)迴圈寫成while (*strdest =*strsrc );,同[1](b)。
(b)迴圈寫成while (*strsrc!='/0') *strdest =*strsrc ;,說明答題者對邊界條件的檢查不力。迴圈體結束後,strdest字串的末尾沒有正確地加上'/0'。
2.返回strdest的原始值使函式能夠支援鏈式表示式,增加了函式的「附加值」。同樣功能的函式,如果能合理地提高的可用性,自然就更加理想。鏈式表示式的形式如:
int ilength=strlen(strcpy(stra,strb));
又如:char * stra=strcpy(new char[10],strb);
返回strsrc的原始值是錯誤的。其一,源字串肯定是已知的,返回它沒有意義。其二,不能支援形如第二例的表示式。其三,為了保護源字串,形參用const限定strsrc所指的內容,把const char *作為char *返回,型別不符,編譯報錯。
strcpy與memcpy的區別
考點:字串複製與記憶體複製之間的區別。
出現頻率:★★★★
解析strcpy和memcpy主要有以下3方面的區別。
複製的內容不同。strcpy只能複製字串,而memcpy可以複製任意內容,例如字元陣列、整型、結構體、類等。
複製的方法不同。strcpy不需要指定長度,它遇到字串結束符"/0"便結束。memcpy則是根據其第3個引數決定複製的長度。
用途不同。通常在複製字串時用strcpy,而需要複製其他型別資料時則一般用memcpy。
下面是更加詳細的strcpy與memcpy函式的編寫與應用:
程式設計實現strcpy函式。
考點:字串複製的實現。
出現頻率:★★★★
已知strcpy函式的原型是:
char * strcpy(char * strdest,const char * strsrc);
要求如下。
(1)不呼叫庫函式,實現strcpy函式;
(2)解釋為什麼要返回char *。
解析程式**如下:
1 #include23 char * strcpy(char * strdest, const char * strsrc) // 實現strsrc到strdest的複製
4
9 char *strdestcopy = strdest; //儲存目標字串的首位址
10 while ((*strdest++ = *strsrc++)!='/0'); //把strsrc字串的內容複製到strdest下
11
12 return strdestcopy;
13 }
14
15 int getstrlen(const char *strsrc) //實現獲取strsrc字串的長度
16
22
23 return len;
24 };
25
26 int main()
27
(1)strcpy函式的實現說明。
**第5~第7行判斷傳入的引數strdest和strsrc是否為null,如果是則返回null。
**第9行把strdest的值儲存到strdestcopy指標中。
**第10行對strsrc和strdest兩個指標進行迴圈移動,並不斷複製strsrc記憶體的值到strdest記憶體中。
由於已經儲存了strdest指標的值,因此這裡只需返回strdestcopy的值,而函式呼叫完後返回的就是strdest的值。
(2)strcpy函式返回char *型別的原因是為了能使用鏈式表示式。首先呼叫strcpy使得strdest指標複製strsrc的記憶體資料,然後呼叫getstrlen函式獲取strdest字串的長度。這樣不僅呼叫方便,而且程式結構簡潔明瞭。程式的輸出結果如下:
strdest: hello world!
length of strdest: 12
程式設計實現memcpy函式。
考點:記憶體複製的實現。
出現頻率:★★★★
答案程式**如下所示:
1 #include2 #include
3
4 void *memcpy2(void *memto, const void *memfrom, size_t size)
5
15
16 int main()
17
memcpy的實現如下。
與strcpy不同,memcpy用引數size決定複製多少個字元(strcpy遇到結束符"/0"結束)。由於在主程式中只複製了strsrc的前4個字元(**第22行),程式輸出如下:
strdest: hell
編寫字串反轉函式
首先用陣列下標的形式實現 提供三種方法 1 有中間變數 2 無中間變數 3 堆疊實現 include include void reverse str char ch void reverse str2 char ch int main void void reverse str char ch 使...
字串複製,不使用strcpy函式。
題目描述 設計函式實現字串複製功能。每個字串長度不超過100。不要使用系統提供的strcpy函式。輸入要求 從鍵盤讀入乙個字串到陣列b中,以換行符結束。輸出要求 將內容複製到另乙個陣列a中,並分別輸出陣列a和陣列b中的內容。輸入樣例 frank comes from thailand.輸出樣例 st...
字串函式strcpy
strcpy是字串複製函式,作用是將字串2複製到字元陣列1中去。說明 1.字元陣列1必須定義得足夠大,以便容納被複製的字串 2.字元陣列1 必須寫成陣列名形式 如str1 字串2 可以是字元陣列名,也可以是乙個字串常量。3.如果在複製前未對str1陣列賦值,則str1各位元組的內容是無法預知的,複製...