Home > سي++C > String Tokenizer Class

String Tokenizer Class

أغسطس 31st, 2009 Wajdy Essam

السلام عليكم ورحمة الله وبركاته ،

عملية الToeknizing هي من أشهر العمليات عند التعامل مع النصوص ، وهي بشكل عام تقسيم النص الى عدة نصوص ويتم فصل ذلك النص حسب العلامة التي تريدها ..

للأسف لا توجد في لغه سي++ القياسية Standard C++ Library أي كلاس أو دالة جاهزة للقيام بذلك بشكل مباشر ( توجد داله في مكتبة لغه السي القياسية C Run-time Library بالإسم strtok تقريبا ولكن كما يوضح الإسم هي تتعامل مع نصوص السي C-Style String وليس string in cpp ) ، كما أن التعامل مع تلك الدالة يحتاج لإستخدام بضعه دوال أخرى في السي للتعامل مع النصوص .

لذلك قمت بكتابة هذا الكلاس وأسميته بنفس الإسم الذي يوجد في الجافا StringTokenizer ،، حاليا يتم ارسال معامل الفصل Delimiter في دالة البناء وفي هذه النسخه الأولى من الكلاس يتم فقط

ارسال معامل واحد وسيتجاهل البقية اذا تم ارسالها .. يمكن بقليل من التعديل التعامل مع أي معامل يتم ارساله .. أترك هذا التعديل لمن هم مهتم بالكلاس ..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// StringTokenizer.h
// Auther: Wajdy Essam

#ifndef __STOKEN__
#define __STOKEN__

#include <iostream>
#include <vector>
using std::string ;
using std::vector ;

class StringTokenizer {
 public :
 StringTokenizer(const string& text , const string& sep=" ") ;
 int getCount () const ;
 string elementAt (int index) const ;

 private:
 vector<string> elements ;
 int count ;
};

StringTokenizer :: StringTokenizer(const string& text , const string& sep) {
 count = 0 ;
 string tmp = "" ;
 for (unsigned int i=0 ; i<text.length() ; i++) {
 if ( text[i] == sep[0] ) {
 elements.push_back(tmp);
 tmp = "" ;
 }
 else {
 tmp += text[i] ;
 }
 }

 elements.push_back(tmp);
 count = elements.size();
}

int StringTokenizer :: getCount () const {
 return count ;
}

string StringTokenizer:: elementAt (int index ) const {
 return elements[index] ;
}

#endif // __STOKEN__

يمكن للتطوير أيضا اعادة تعريف المعامل [] operator overloading بحيث يكون التعامل مع الكائن أكثر مرونه من استدعاء الدالة elementAt .

برنامج اختبار بسيط :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// String Tokenizer Test
// Auther: Wajdy Essam

#include <iostream>
using namespace std ;

#include "StringTokenizer.h"

int main (int argc , char* argv[]) {
 // separate string with space
 string name = "My name is Wajdy Essam" ;
 StringTokenizer token(name);
 for (int i=0 ; i<token.getCount() ; i++)
 cout << token.elementAt(i) << endl;

 cout << endl << endl;

 // separate string with forword slash
 string path = "C:\\ProgramFiles\\JavaCode" ;
 StringTokenizer tokenPath(path,"\\");
 for (int i=0 ; i<tokenPath.getCount() ; i++)
 cout << tokenPath.elementAt(i) << endl;

 cin.get();
 return (0);
}

وهذا مخرج برنامج الإختبار السابق :

token

أرجوا أن يفيد ذلك الكلاس ،،

بالتوفيق ،،

Categories: سي++C Tags:
  1. نوفمبر 20th, 2009 at 02:19 | #1

    بالمناسبة في جافا الموضوع لا يقتصر على الفواصل العادية
    وإنما يمكنك أن تستخدم regex لهذا الموضوع

    تحياتي

  2. Texas Holdem
    أغسطس 8th, 2010 at 14:31 | #2

    Hey guys, tried grabbing this blog via Google RSS by putting your feed link into it, but im getting a strange error message, any ideas?

  3. أغسطس 18th, 2010 at 19:36 | #3

    Nevermind, works now!

Comments are closed.