现在的位置: 首页 > 综合 > 正文

【库函数源码剖析系列】(1) strcpy

2013年08月22日 ⁄ 综合 ⁄ 共 1070字 ⁄ 字号 评论关闭

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

 

抱歉!评论已关闭.