
Мудрый...
   
Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004
Репутация: 2 Всего: 261
|
chipset, bsa, Joss, UnrealMan, благодарю за помощь. Вот что получилось: Код | #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <string.h>
class String { private: int Len; char * Str; public: String( void ); String( char ch ); String( char * s ); String( char & s );
char & operator [] ( int index );
String & operator = ( const String & s ); String & operator += ( const String & s ); String & operator + ( const String & s );
bool operator == ( const String & s ); bool operator != ( const String & s ); bool operator <= ( const String & s ); bool operator >= ( const String & s ); bool operator < ( const String & s ); bool operator > ( const String & s );
char * GetString( void ); int GetLength( void ); String & SubString( int StartIndex ); String & SubString( int StartIndex , int Length ); int IndexOf( const String & s );
~String(); };
String::String( void ) { this->Str = ""; this->Len = 0; }
String::String( char ch ) { this->Str = (char *) malloc( sizeof( char ) ); this->Str = ( char * )ch; this->Len = 1; }
String::String( char * s ) { this->Str = (char *) calloc( strlen( s ) , sizeof( char ) ); this->Str = ( char * ) s; this->Len = this -> GetLength(); }
String::String( char & s ) { this->Str = (char *) calloc( strlen( &s ) , sizeof( char ) ); this->Str = & s; this->Len = this -> GetLength(); }
int String::GetLength( void ) { return strlen( this -> Str ); }
char * String::GetString( void ) { return this -> Str; }
bool String::operator == ( const String & s ) { return this->Len == s.Len && 0 == strcmp( this->Str , s.Str ); }
bool String::operator != ( const String & s ) { return this->Len != s.Len || 0 != strcmp( this->Str , s.Str ); }
bool String::operator >= ( const String & s ) { return this->Len >= s.Len && 0 <= strncmp( this->Str , s.Str , this->Len ); }
bool String::operator <= ( const String & s ) { return this->Len <= s.Len && strncmp( this->Str , s.Str , this->Len ) <= 0; }
bool String::operator >( const String & s ) { return this->Len > s.Len && 0 < strncmp( this->Str , s.Str , this->Len ); }
bool String::operator < ( const String & s ) { return this->Len < s.Len && 0 > strncmp( this->Str , s.Str , this->Len ); }
String & String::SubString( int StartIndex ) { String *st = new String();
if( StartIndex >= this->Len ) { return *st; }
st->Str = (char *) malloc( ( this->Len - StartIndex ) * sizeof( char ) ); st->Len = ( this->Len - StartIndex );
memcpy( st->Str , this->Str + StartIndex , this->Len );
st->Str[ ( this->Len - StartIndex ) ] = '\0';
return *st; }
String & String::SubString( int StartIndex , int Length ) { String *st = new String();
if( StartIndex + Length >= this->Len ) { return *st; }
st->Str = (char *) malloc( Length * sizeof( char ) ); st->Len = Length;
memcpy( st->Str , this->Str + StartIndex , Length );
st->Str[ Length ] = '\0';
return *st;
}
int String::IndexOf( const String & s ) { int i;
for ( i = 0 ; i <= this->Len - s.Len ; i++ ) { if ( !strncmp( this->Str + i , s.Str , s.Len ) ) { return i; } }
return -1; }
char & String::operator [] ( int index ) { if( index < 0 || index > this -> Len ) { printf( "Неверный индекс i = %d" , index ); exit( 0 ); }
return this -> Str[ index ]; }
String & String::operator + ( const String & s ) { String * result = new String( this->Str );
*result += (String &)s;
return *result; }
String & String::operator += ( const String & s ) { char * st = this->Str; int len = this->Len;
this->Str = (char *) malloc( ( len + s.Len ) * sizeof( char ) );
Len = strlen( st ); memcpy( this->Str , st , this->Len );
memcpy( this->Str + this->Len , s.Str , s.Len ); Len += s.Len;
Str[ Len ] = '\0';
return *this; }
String & String::operator = ( const String & s ) { this->Str = (char *) malloc( s.Len * sizeof( char ) );
this->Str = s.Str; this->Len = s.Len;
return *this; }
String::~String() { delete [] Str; }
void main() { String * Str1 , * Str2 , * Str3 , * Str4 , * Str5;
Str1 = new String( "123456789" ); Str2 = new String( "abcdefghi" ); Str3 = new String(); Str4 = new String(); Str5 = new String( "abcdefghi" );
printf( "Str1 = %s\nStr2 = %s\nStr3 = %s\nStr4 = %s\nStr5 = %s\n\n" , Str1->GetString() , Str2->GetString() , Str3->GetString() , Str4->GetString() , Str5->GetString() );
*Str3 = (String &)(*Str2) + (String &)(*Str1);
printf( "Str3 = Str2 + Str1 = \n\t\t\t\t\t\t%s\n" , Str3->GetString() );
*Str1 += (String &)(*Str2);
printf( "Str1 += Str2 = \n\t\t\t\t\t\t%s\n" , Str1->GetString() );
*Str1 = Str1->SubString( 7 );
printf( "Str1 = Subtring( 7 ) ( Str1 ) = \n\t\t\t\t\t\t%s\n" , Str1->GetString() );
*Str4 = Str1->SubString( 2 , 4 );
printf( "Str4 = Subtring( 2, 4 ) ( Str1 ) = \n\t\t\t\t\t\t%s\n" , Str4->GetString() );
printf( "\nStr1 = %s\nStr2 = %s\nStr3 = %s\nStr4 = %s\nStr5 = %s\n\n" , Str1->GetString() , Str2->GetString() , Str3->GetString() , Str4->GetString() , Str5->GetString() ); printf( "Str2 %s Str1\t" , ( Str2->operator > ( (String &)(* Str1) ) ) ? ">" : "<=" ); printf( "Str3 %s Str2\t" , ( Str3->operator ==( (String &)(* Str2) ) ) ? "==" : "!=" ); printf( "Str4 %s Str2\t" , ( Str4->operator !=( (String &)(* Str2) ) ) ? "!=" : "==" ); printf( "Str5 %s Str2\t" , ( Str5->operator ==( (String &)(* Str2) ) ) ? "==" : "!=" ); printf( "Str4 %s Str1\t" , ( Str4->operator < ( (String &)(* Str1) ) ) ? "<" : ">=" ); printf( "Str1 %s Str4\n" , ( Str4->operator > ( (String &)(* Str4) ) ) ? ">" : "<=" );
printf( "\n" );
int pos; pos = Str1->IndexOf( *Str4 );
if( pos > 0 ) { printf( "Str4 IndexOf Str1 = %d\t\t" , pos ); } else { printf( "Str4 IndexOf Str1 = not found\t\t" ); }
pos = Str3->IndexOf( *Str2 );
if( pos > 0 ) { printf( "Str3 IndexOf Str2 = %d\t" , pos ); } else { printf( "Str3 IndexOf Str2 = not found\t" ); }
getch(); exit(0); }
|
|