前言:學C語言的時候,我就想把C語言的庫函數的函數體找出來,如果知道了函數的定義(*.h裡只是一個函數原型),那麼老譚那本書上有的文法就不用講了,自己還能深入理解!於是,我準備開這個系列,把自己搜集的庫函數定義記下來,唯一的要求是與微軟實現的庫函數功能一致,無任何bug。每篇之後,如果自己有什麼看法會寫在後面,各位有何高見也歡迎評論。我發現,源碼中的函數體裡大多隻需用三個東西:指標,if語句,while語句。
第一篇就以許多公司喜歡面試的一道題開始吧:
strcpy的實現(為了區別,函數名首字母大寫,以後都是):
// strcpy#include <stdio.h>char *Strcpy(char *dest, const char *src){char *tmp = dest;while ( (*dest++ = *src++) != '\0' );return tmp;}int main(int argc, char **argv){char str[128];Strcpy(str, "Hello, 碼工的第一個源碼!");printf("str = %s\n", str);return 0;}
1、strcpy返回的是個指標,貌似這不太好。
2、函數體裡也沒什麼記憶體檢查,極易出錯。(推薦使用strncpy, more:http://msdn.microsoft.com/en-us/library/f0151s4x(v=vs.100).aspx)
還要注意的是,當兩個字串(或兩個指標指向的字串)重疊時,用strcpy是未定義的。比如:
#include <stdio.h>#include <string.h>char *Strcpy(char *dest, const char *src){char *tmp = dest;while ( (*dest++ = *src++) != '\0' );return tmp;}int main(int argc, char **argv){char str[] = "123";strcpy(str + 1, str);// 輸出很奇怪//Strcpy(str + 1, str);//strcpy(str + 2, str);printf("%s\n", str);return 0;}
未定義的行為都是錯的,即使對的,也是巧合,要禁止!
2012/10/11
more:
http://www.gnu.org/software/libc/
http://code.google.com/codesearch#wZuuyuB8jKQ/src/third_party/glibc/&type=cs