前言:学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