|
13-04-2005, 12:10
|
|
|
|
חבר מתאריך: 20.06.03
הודעות: 5,616
|
|
מימוש מחלקה "מחרוזת" ב ++C
אני מעלה קוד של מחלקה שכתבתי בזמן שלמדתי ++C, המחלקה נועדה לטפל במחרוזות (sstring), לאור הדיון שהיה על נושא מחרוזות ב ++C.
אני אישית מוצא שעל מנת לעבוד עם מחרוזות ב +CC עדיף לעבוד עם מחלקה שנועדה לזה ולא עם מערך של char.
פונקציות של המחלקה (ציבוריות):
Length - מחזירה אורך מחרוזת
NumOfWords - מחזירה מספר מילים (מופרדות ברווח) במחרוזת
Word - מחזיר מילה מהמיקום ה-n שלה במחרוזת
אופרטורים:
= אופרטור הצבה
=+ אופרטור שירשור
+ אופרטור שירשור
==,>,<,=!,=<,=> אופרטורי השוואה
>>,<< אופרטורי זרימה
[] אופרטור אינדקס
אני לא סגור על זה שזה הקוד האחרון וללא הבאגים שנכתב - זה מה שמצאתי בארכיון שלי, הרצתי בדיקה קטנה משלי (קומפיילר של ++VC) וכל הפונקציות/אופרטורים עבדו ללא בעייה.
אני ממליץ לבדוק תאימות עבור מהדרים נוספים, בתכלס, לא אמורה להיות בעייה כלשהי.
להלן קובץ ה-header:
SString.hpp
קוד PHP:
#ifndef _SSTRING_H_ #define _SSTRING_H_ #include <cstring> #include <iostream> using namespace std; class SString { protected: char *buf; int Assign( char *p ); char *GetBuffer( void ){ return buf; } // obsolete function char GetChar( int ); // obsolete function void Write( void ){ cout<<buf; } // obsolete function void WriteLn( void ){ Write(); cout<<endl; } // obsolete function int Copy( char *p ){ delete[] buf ; return Assign(p); } int Copy( const SString & s ){ return Copy(s.buf); } int Concat( char* ); int Concat( const SString & s ){ return Concat(s.buf); } public: SString( void ){ Assign(NULL);} SString( char *p){ Assign(p);} SString( const SString & s ){ Assign(s.buf);} int Length( void ) const { return strlen(buf); } int NumOfWords( void ); SString Word( int ); ~SString( void ){ delete[] buf ; } // assignment operators SString & operator=( const SString &s ) { this->Copy( s ); return *this; } SString & operator=( char *p ) { this->Copy( p ); return *this; } // concatenation operators ( += version ) SString & operator+=( const SString &s ) { this->Concat( s ); return *this; } SString & operator+=( char *p ) { this->Concat( p ); return *this; } // concatenation operators ( + version ) SString operator+( const SString & s ) const { SString res( *this ); res += s; return res; } SString operator+( char *p ) const { SString res( *this ); res += p; return res; } // compare operators bool operator==( const SString &s ) const { return strcmp( this->buf, s.buf ) == 0; } bool operator==( char *p ) const { return strcmp( this->buf, p ) == 0; } friend bool operator==( char *p, const SString &s ) { return strcmp( p, s.buf ) == 0; } bool operator!=( const SString &s ) const { return strcmp( this->buf, s.buf ) != 0; } bool operator!=( char *p ) const { return strcmp( this->buf, p ) != 0; } friend bool operator!=( char *p, const SString &s ) { return strcmp( p, s.buf ) != 0; } bool operator>( const SString &s ) const { return strcmp( this->buf, s.buf ) > 0; } bool operator>( const char *p ) const { return strcmp( this->buf, p ) > 0; } friend bool operator>( const char *p, const SString &s ) { return strcmp( p, s.buf ) > 0; } bool operator<( const SString &s ) const { return strcmp( this->buf, s.buf ) < 0; } bool operator<( const char *p ) const { return strcmp( this->buf, p ) < 0; } friend bool operator<( const char *p, const SString &s ) { return strcmp( p, s.buf ) < 0; } bool operator>=( const SString &s ) const { return strcmp( this->buf, s.buf ) >= 0; } bool operator>=( const char *p ) const { return strcmp( this->buf, p ) >= 0; } friend bool operator>=( const char *p, const SString &s ) { return strcmp( p, s.buf ) >= 0; } bool operator<=( const SString &s ) const { return strcmp( this->buf, s.buf ) <= 0; } bool operator<=( const char *p ) const { return strcmp( this->buf, p ) <= 0; } friend bool operator<=( const char *p, const SString &s ) { return strcmp( p, s.buf ) <= 0; } // input/output operator friend ostream& operator<<( ostream &o, const SString &s ) { o << s.buf; return o; } friend istream& operator>>( istream &i, SString &s ) { char b[ 4096 ]; i.getline( b, 4095, '\n' ); b[ i.gcount() ] = '\0'; s.Copy( b ); return i; } // operator[] char & operator[] ( unsigned int i ) { return ( i < Length() ? buf[ i ] : buf[ Length() ] ); } }; // global (char*)+(SString) operator. Implementation is in sstring.cpp SString operator+( char *, const SString & ); #endif
וקובץ המימוש:
SString.cpp
קוד PHP:
#include "sstring.hpp" int SString::Assign( char *p ) { if( p ) { buf = new char [ strlen( p ) + 1 ]; strcpy( buf, p ); } else { buf = new char[ 1 ]; buf[0] = '\0' ; } return strlen( buf ); } int SString::Concat( char * p ) { if( p ) { char *temp; temp = new char [ strlen( buf ) + strlen( p ) + 1 ]; strcpy( temp, buf ); strcat( temp, p ); delete[] buf; buf = temp; } return strlen( buf ); } char SString::GetChar( int i ) { char res ='\0'; if( i >= 0 && i < (int) strlen( buf ) ) res = buf[ i ]; return res; } #define SEP " ,;." int SString::NumOfWords( void ) { int result = 0; char* pword; SString tmp( *this ); pword = strtok ( tmp.buf, SEP ); while ( pword ) { ++result; pword = strtok( NULL, SEP ); } return result; } SString SString::Word( int i ) { char* pword; int j = 0; SString temp( *this ), result; pword = strtok ( temp.buf, SEP ); while ( pword && j < i ) { pword = strtok ( NULL, SEP ); ++j; } if( pword && j == i ) result.Copy( pword ); return result; } SString operator+( char *p, const SString &s ) { SString res( p ); res += s; return res; }
|
|