c标准库函数实现源码
(2012-10-26 20:56:36)
标签:
cstdlib库函数it |
分类: C/C_plus_plus |
很多偏底层的公司为了考察你对基础知识的掌握程度,以及编程知识是否过硬,会经常出一些要你实现C标准库函数中的代码,当然是限定你时间完成,而且还要考虑各种非法情况,即你要考虑周全,我承认在压力情况下,我的思路很容易受阻,而且一紧张经常容易漏掉一些东西,之前面过一家WS微电子公司,结果程序是写出来了,但是不完美,结果被BS了,所以现在把各个基础的库函数的实现贴出来,方便记忆也为了了解实际我们在使用某个库函数时,其内部工作机制吧。
1)字符串拷贝
-
char
* charstrcpy( *strDest, constchar *strSrc ) -
{
-
if(strDest == returnstrSrc) { strDest; } -
assert( (strDest != NULL) && (strSrc != NULL) ); -
char *address = strDest; -
while( (*strDest++ '/0'= * strSrc++) != ); -
return address; - }
-
//字串末尾要加结束符'/0',不然输出错位结果
-
char
*strncpy( char*strDes, constchar *strSrc, intunsigned count) -
{
-
assert(strDes != NULL && strSrc != NULL); -
char *address = strDes; -
while (count-- '/0')&& *strSrc != -
*strDes++ = *strSrc++; -
*strDes = '/0'; -
return address; - }
2)字符串比较
-
int
strcmp( constchar *s, constchar *t) -
{
-
assert(s != NULL && t != NULL); -
while (*s && *t && *s == *t) -
{ -
++ s; -
++ t; -
} -
return (*s - *t); - }
-
-
int
strncmp( constchar *s, constchar *t, intunsigned count) -
{
assert((s != NULL) && (t != NULL)); -
while (*s && *t && *s == *t && count --) -
{ ++ s; ++ t; } -
return (*s - *t); -
}
3)字符串连接
-
char
*strcat( char*strDes, constchar *strSrc) -
{
-
assert((strDes != NULL) && (strSrc != NULL)); -
char *address = strDes; -
while (*strDes '/0')!= -
++ strDes; -
while ((*strDes '/0')++ = *strSrc ++) != -
NULL; -
return address; - }
-
char
*strncat( char*strDes, constchar *strSrc, intunsigned count) -
{
-
assert((strDes != NULL) && (strSrc != NULL)); -
char *address = strDes; -
while (*strDes '/0')!= -
++ strDes; -
while (count '/0'-- && *strSrc != ) -
*strDes ++ = *strSrc ++; -
*strDes = '/0'; -
return address; -
}
4)字符串长度
-
int
strlen( constchar *str) -
{
-
assert(str != NULL); -
int len = 0; -
while (*str '/0')++ != -
++ len; -
return len; - }
5)字符串匹配
-
char
*strstr( constchar *strSrc, constchar *str) -
{
-
assert(strSrc != NULL && str != NULL); -
const char *s = strSrc; -
const char *t = str; -
for (; '/0';*strSrc != ++ strSrc) -
{ -
for (s '/0'= strSrc, t = str; *t != && *s == *t; ++s, ++t) -
NULL; -
if (*t '/0')== -
return ( char*) strSrc; -
} -
return NULL; - }
6)内存块复制
-
void
*memcpy( void*dest, constvoid *src, intunsigned count) -
{
-
assert((dest != NULL) && (src != NULL)); -
void *address = dest; -
while (count --) -
{ -
*(char *) chardest = *( *) src; -
dest = (char *) dest + 1; -
src = (char *) src + 1; -
} -
return address; - }
7)内存块赋值初始化
-
void
*memset( void*str, intc, intunsigned count) -
{
-
assert(str != NULL); -
void *s = str; -
while (count --) -
{ -
*(char *) char)s = ( c; -
s = (char *) s + 1; -
} -
return str; -
}