最近有点懒很久没有上CSDN上发表文章,抽出了点时间把字符串处理函数重写了一遍。本文仅供参考,如有错误请纠正。谢谢!
/*
函数: strcpy
原型: char * strcpy( char* _Dest, const char *_Source );
功能: 复制源串_Source到目标串_Dest所指定的位置,
包含NULL结束符. 不能处理源串与目标串重叠的情况.
函数返回_Dest值.
*/
char * strcpy( char *_Dest, const char *_Source )
{
assert( ( NULL != _Dest ) && ( NULL != _Source ) );
char *_Temp = _Dest;
while ( '\0' != ( *_Temp++ = *_Source++ ) );
return _Dest;
}
/*
函数: strlen的实现代码
功能: size_t strlen( const char *_Str );
功能: 获取字符串长度, 字符串结束符NULL不计算在内.
没有返回值指示操作错误.
*/
size_t strlen( const char *_Str )
{
assert( NULL != _Str );
size_t _Size = 0;
while ( '\0' != *_Str++ )
{
++_Size;
}
return _Size;
}
/*
函数: strcat
原型: char * strcat( char *_Dest, const char *_Source );
功能: 将源串_Src字符添加到目标串_Dst后.
本函数不能处理源串与目标串重叠的情况.
*/
char * strcat( char *_Dest, const char *_Source )
{
assert( ( NULL != _Dest ) && ( NULL != _Source ) );
char *_Temp = _Dest;
while ( '\0' != ( *++_Temp ) );
while ( '\0' != ( *_Temp++ = *_Source++ ) );
return _Dest;
}
/*
函数: strcmp
原型: int strcmp( const char *_Str1, const char *_Str2 );
功能: 比较字符串_Str1和_Str2大小.
返回值< 0, 表示_Str1小于_Str2;
返回值为0, 表示_Str1等于_Str2;
返回值> 0, 表示_Str1大于_Str2.
*/
int strcmp( const char *_Str1, const char *_Str2 )
{
assert( ( NULL != _Str1 ) && ( NULL != _Str2 ) );
for ( ; *_Str1 == *_Str2; _Str1++, _Str2++ )
{
if ( ( '\0' == *_Str1 ) || ( '\0' == *_Str2 ) )
{
if ( *_Str1 == *_Str2 )
{
return 0;
}
else
{
break;
}
}
}
return ( ( *_Str1 > *_Str2 ) ? 1 : -1 );
}
/*
函数: strlwr的实现代码
功能: char * strlwr( char *_Str );
功能: 将字符串_Str的大写转换成小写并输出.
*/
char * strlwr( char *_Str )
{
assert( NULL != _Str );
char *_Temp = _Str;
do
{
if ( ( *_Temp >= 'A' ) && ( *_Temp <= 'Z' ) )
{
*_Temp += 'a' - 'A';
}
}while( '\0' != ( *_Temp++ ) );
return _Str;
}
/*
函数: strupr的实现代码
功能: char * strupr( char *_Str );
功能: 将字符串_Str的小写转换成大写并输出.
*/
char * strupr( char *_Str )
{
assert( NULL != _Str);
char *_Temp = _Str;
do
{
if ( ( *_Temp >= 'a' ) && ( *_Temp <= 'z' ) )
{
*_Temp -= 'a' - 'A';
}
}while( '\0' != ( *_Temp++ ) );
return _Str;
}
/*
函数: strrev的实现代码
功能: char * strrev( char *_Str );
功能: 将字符串_Str倒转并输出.
*/
char * strrev( char *_Str )
{
assert( NULL != _Str );
char *_Str1 = _Str;
char *_Str2 = _Str;
char _Temp;
while ( '\0' != *_Str2 )
{
*_Str2++;
}
if( _Str1 != _Str2 )
{
_Str2--;
}
while ( _Str1 < _Str2 )
{
_Temp = *_Str1;
*_Str1 = *_Str2;
*_Str2 = _Temp;
*_Str1++;
*_Str2--;
}
return _Str;
}
/*
函数: strchr的实现代码
功能: const char * strchr( const char *_Str, int _Val );
功能: 函数返回一个指向Str中_Val首次出现的位置,当没有在_Str中找_Val到返回NULL。
*/
const char * Strchr( const char *_Str, int _Val )
{
assert( NULL != _Str );
for ( ; *_Str != (char)_Val; ++_Str )
{
if ( '\0' == *_Str )
{
return (const char *)NULL;
}
}
return _Str;
}
/*
函数: strpbrk的实现代码
功能: char * strpbrk( char *_Str, const char *_Control );
功能: 函数返回一个指针,它指向字符串_Control中任意字符在字符串_Str首次出现的位置,如果不存在返回NULL.
*/
char * strpbrk( char *_Str, const char *_Control )
{
assert( ( NULL != _Str ) && ( NULL != _Control ) );
char *_Str1;
const char *_Str2;
for ( _Str1 = _Str; '\0' != *_Str1; ++_Str1 )
{
for ( _Str2 = _Control; '\0' != *_Str2; ++_Str2 )
{
if ( *_Str1 == *_Str2 )
{
return _Str1;
}
}
}
return (char*)NULL;
}
/*
函数: strstr的实现
原型: char * strstr( char *_Str, const char *_SubStr );
功能: 在字符串_Str中查找_SubStr子串.
返回子串_SubStr在_Str中首次出现位置的指针.
如果没有找到子串_SubStr,
则返回NULL. 如果子串_SubStr为空串, 函数
返回_Str值.
*/
char * strstr( char *_Str, const char *_SubStr )
{
assert( ( NULL != _Str ) && ( NULL != _SubStr ) );
unsigned int i = 0;
if ( '\0' == *_Str )
{
if ( '\0' != *_SubStr )
{
return (char*)NULL;
}
return _Str;
}
while ( '\0' != *_Str )
{
i = 0;
while (1)
{
if ( '\0' == _SubStr[i] )
{
return _Str;
}
if ( _SubStr[i] != _Str[i] )
{
break;
}
++i;
}
++_Str;
}
return (char*)NULL;
}
/*
函数: strtok的实现代码
功能: char * strtok( char *_Str, const char *_Delim );
功能: 查找由_Delim指定分界符对_Str进行分解.首次调用_str指向要分解的字符串,以后调用_Str为NULL.
*/
char * strtok( char *_Str, const char *_Delim )
{
static char *_Begin;
if ( NULL != _Str )
{
_Begin = strstr( _Str, _Delim );
while ( _Begin == _Str )
{
_Str += strlen( _Delim );
_Begin = strstr( _Str, _Delim );
}
}
else
{
_Str = _Begin;
if ( NULL == _Str )
{
return NULL;
}
_Begin = strstr( _Str, _Delim );
while ( _Begin == _Str )
{
_Str += strlen( _Delim );
_Begin = strstr( _Str, _Delim );
}
}
if ( NULL != _Begin )
{
memset( _Begin, 0, strlen( _Delim ) );
_Begin += strlen( _Delim );
}
else if ( 0 == *_Str )
{
return NULL;
}
return _Str;
}