TA的每日心情 | 开心 2021-12-13 21:45 |
---|
签到天数: 15 天 [LV.4]偶尔看看III
|
函数源码
strcpy源码:
- [code]
- char *strcpy(char *strDes, const char *strSrc)
- {
- assert((strDes != NULL) && (strSrc != NULL));
- char *address = strDes;
- while ((*strDes ++ = *strSrc ++) != "\0")
- NULL;
- return address;
复制代码 [/code]
注意:strcpy只是复制字符串,但不限制复制的数量。很容易造成缓冲溢出,也就是说,不过dest有没有足够的空间来容纳src的字符串,它都会把src指向的字符串全部复制到从dest开始的内存
strcmp源码:
- [code]int strcmp(const char *s, const char *t)
- {
- assert(s != NULL && t != NULL);
- while (*s && *t && *s == *t)
- {
- ++ s;
- ++ t;
- }
- return (*s - *t);
- }
复制代码 [/code]
strcat源码:
- [code]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;
- }
复制代码 [/code]
注意:1.不能向形参传递指向字符串常量的指针(本题中dst和src都是指向串常量的指针,字符串常量存储在常量区不能被修改
2.传递的字符数组前一个实参的所分配的内存空间必须足够大
strlen源码:
- [code]int strlen(const char *str)
- {
- assert(str != NULL);
- int len = 0;
- while (*str ++ != "\0")
- ++ len;
- return len;
- }
复制代码 [/code]
strstr源码:
- [code]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;
- }
复制代码 [/code]
strchr源码:
- [code]char * __cdecl strchr (
- constchar * string,
- int ch
- )
- {
- while (*string && *string != (char)ch)
- string++;
- if (*string == (char)ch)
- return((char *)string);
- return(NULL);
- }
复制代码 [/code]
断言:assert(表达式)如果表达式的值为假,整个程序将退出,并输出一条错误信息。如果表达式的值为真则继续执行后面的语句,使用这个宏前需要包含头文件assert.h
结语:函数就向一个黑盒一样,调用它的人给他输入(调用它本身就是一种输入),然后等待一个理想中的输出或者是相应的操作。调用者是希望我们的这个函数能够非常健壮的让他们利用,那么为了使我们的函数拥有一定的鲁棒性。
|
|