C++字符串处理(重写)trcpy、strlen、strcat、strcmp、strlwr、strupr、strrev、strchr、strpbrk、strstr、strtok

时间:2022-12-10 17:01:20

 

最近有点懒很久没有上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;

}