函数的实现要考虑全面,注重程序的代码风格,提高程序的健壮性。
strcpy函数的实现:将源字符串的内容拷贝到目的字符串中,后面的'\0'也是要拷贝到目的字符串中的。所以在调用库函数时要注意数组越界的问题。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 char* strcpy( char *strDest, const char *strSrc ) {
2 assert( ( strDest != NULL ) && ( strSrc != NULL ) ); //assert是宏不是函数,assert( strDest && strStr )
3 char *address = strDest;
4 while( ( *strDest++ = *strSrc++ ) != '\0' );
5 return address;
6 }
2 assert( ( strDest != NULL ) && ( strSrc != NULL ) ); //assert是宏不是函数,assert( strDest && strStr )
3 char *address = strDest;
4 while( ( *strDest++ = *strSrc++ ) != '\0' );
5 return address;
6 }
strstr(s1,s2)是一个经常用的函数,他的作用就是在字符串s1中寻找字符串s2如果找到了就返回指针,否则返回NULL。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 const char* strstr( const char *s1, const char *s2 ) {
2 assert ( s2 && s1 );
3 const char *p = s1, *r = s2;
4 while ( *p++ == *r++ );
5 if ( *r == '\0' )
6 return p;
7 else {
8 r = s2;
9 p = ++s1;
10 }
11 return NULL;
12 }
13
14
15
18 const char* _strstr( const char *str, const char *needle ) {
19 assert( needle && src );
20 const char *p1 = src, *p2 = needle;
21 while ( ( *src != '\0' ) && ( *needle != '\0' ) ) {
22 if ( *src++ != *needle++ ) {
23 needle = p2;
24 src = ++p1; //从下一个字符开始搜索needle
25 }
26 }
27 if ( *needle == '\0' )
28 return p1;
29
30 return NULL;
31 }
2 assert ( s2 && s1 );
3 const char *p = s1, *r = s2;
4 while ( *p++ == *r++ );
5 if ( *r == '\0' )
6 return p;
7 else {
8 r = s2;
9 p = ++s1;
10 }
11 return NULL;
12 }
13
14
15
18 const char* _strstr( const char *str, const char *needle ) {
19 assert( needle && src );
20 const char *p1 = src, *p2 = needle;
21 while ( ( *src != '\0' ) && ( *needle != '\0' ) ) {
22 if ( *src++ != *needle++ ) {
23 needle = p2;
24 src = ++p1; //从下一个字符开始搜索needle
25 }
26 }
27 if ( *needle == '\0' )
28 return p1;
29
30 return NULL;
31 }