部分库函数源码

来源:互联网 发布:game.min.js 编辑:程序博客网 时间:2024/06/03 19:45

函数源码

strcpy源码:

char *strcpy(char *strDes, const char *strSrc)   {       assert((strDes != NULL) && (strSrc != NULL));       char *address = strDes;       while ((*strDes ++ = *strSrc ++) != '\0')           NULL;       return address;   

注意:strcpy只是复制字符串,但不限制复制的数量。很容易造成缓冲溢出,也就是说,不过dest有没有足够的空间来容纳src的字符串,它都会把src指向的字符串全部复制到从dest开始的内存

strcmp源码:

int strcmp(const char *s, const char *t)   {       assert(s != NULL && t != NULL);       while (*s && *t && *s == *t)       {           ++ s;           ++ t;       }       return (*s - *t);   }  

strcat源码:

char *strcat(char *strDes, const char *strSrc)   {    assert((strDes != NULL) && (strSrc != NULL));       char *address = strDes;       while (*strDes != '\0')           ++ strDes;       while ((*strDes ++ = *strSrc ++) != '\0')           NULL;       return address;   }  

注意:1.不能向形参传递指向字符串常量的指针(本题中dst和src都是指向串常量的指针,字符串常量存储在常量区不能被修改
2.传递的字符数组前一个实参的所分配的内存空间必须足够大

strlen源码:

int strlen(const char *str)   {       assert(str != NULL);       int len = 0;       while (*str ++ != '\0')           ++ len;       return len;   }  

strstr源码:

char *strstr(const char *strSrc, const char *str)   {       assert(strSrc != NULL && str != NULL);       const char *s = strSrc;       const char *t = str;       for (; *t != '\0'; ++ strSrc)       {           for (s = strSrc, t = str; *t != '\0' && *s == *t; ++s, ++t)               NULL;           if (*t == '\0')               return (char *) strSrc;       }       return NULL;   }  

strchr源码:

char * __cdecl strchr (                      constchar * string,                      int ch                       ){   while (*string && *string != (char)ch)        string++;   if (*string == (char)ch)       return((char *)string);    return(NULL);}

断言:assert(表达式)如果表达式的值为假,整个程序将退出,并输出一条错误信息。如果表达式的值为真则继续执行后面的语句,使用这个宏前需要包含头文件assert.h
结语:函数就向一个黑盒一样,调用它的人给他输入(调用它本身就是一种输入),然后等待一个理想中的输出或者是相应的操作。调用者是希望我们的这个函数能够非常健壮的让他们利用,那么为了使我们的函数拥有一定的鲁棒性。

阅读全文
0 0
原创粉丝点击