You are on page 1of 7

1 | C++ string

CHUI K T TRONG C++


KIU CHUI CA C V HN CH Khi mi hc C, chc cc bn u rt bi ri khi lm vic vi xu k t, vic s dng con tr lu xu k t rt phc tp, d gy li khin nhiu ngi cho rng n khng bng xu k t trong Pascal. Cc chng trnh C++ c th s dng chui theo cch thc c ca Ngn ng C: mng cc k t kt thc bi k t m ASCII l 0 (k t \0) cng vi cc hm th vin khai bo trong <string.h> . C nhiu bt tin khi dng theo cch thc ny: Ngi lp trnh phi ch ng kim sot b nh cp pht cho chui k t. Ni chung l phi am hiu v rt thng tho v k thut dng b nh v con tr th chng trnh mi trnh c cc li v k thut; Khng th gn gi tr hay s dng php ton + (ghp chui) v cc php ton so snh nh: > (ln hn), < (nh hn), m phi gi cc hm th vin trong <string.h>; Nu dng k thut cp pht ng th phi qun l vic cp thm b nh khi chui dn ra (chng hn do ghp chui) v phi hy b nh (khi khng dng na) trnh vic cn kit b nh ca my tnh trong trng hp c nhiu chng trnh hot ng ng thi.

KIU CHUI STRING TRONG TH VIN STL CA C++ Th vin chun STL (Standard Template Library) cung cp kiu string (xu k t), gip cc bn trnh khi hon ton cc phin phc nu trn. Cc ch th #include cn khai bo s dng string : #include <string> using std::string; //using namespace std; CC PHNG THC, PHP TON TIN CH CA KIU STRING Kiu string ca STL h tr cc nhm phng thc v php ton tin ch sau y. a) Cc php ton v phng thc c bn Cc ton t +, += dng ghp hai chui v cng ghp mt k t vo chui; Cc php so snh theo th t t in: == (bng nhau), != (khc nhau), > (ln hn), >= (ln hn hay bng), < (nh hn), <= (nh hn hay bng); Phng thc length( ) v php ly ch s [ ] duyt tng k t ca chui: nu s l bin kiu string th s[i] l k t th i ca s vi 0 i <s.length( ); Php gn (=) dng gn bin kiu string bng mt chui, hoc bng string khc, chng hn: string s=ABCDEF; hay s1=s2; m khng cn copy xu. Nhng constructor thng s dng nht: string(); string(const char *str); string(const string & str); C th dng ton t << vi cout xut mt chui ra mn hnh hoc dng ton t >> vi cin nhp mt chui k t n khi gp mt khong trng th dng. char st[]=ABCDEF; string s; s=XYZ; cout << s << endl; s=st; cout << s.length() << : << s << endl; //

2 | C++ string
Mt vn thng ny sinh trong cc ng dng c s dng C-string: mt C-String cha khi to cn c gn NULL. Tuy nhin, rt nhiu hm th vin ca C-String s gp s c trong thi gian chy khi gp i tng CString l NULL. Chng hn, lnh char* x = NULL; cout << strlen(x); c mt s trnh bin dch chp nhn, nhng vi nhiu hin thc khc ca th vin C-String, th gp li trong thi gian chy. string khng gp vn ny, ta hon ton c th cho 1 xu l rng m khng gp bt c li no: string s=""; String thc cht l mt vector<char> c b sung thm mt s phng thc v thuc tnh, do , n c ton b cc tnh cht ca 1 vector, vd hm size(), push_back(), ton t [] Phng thc v.size() v.empty () v.max_size() v1 == v2 v1 != v2 v.begin() v.end() v.front() v.back() v1.swap(v2) M t S lng phn t Tr v 1 nu chui rng, 0 nu ngc li. Tr v s lng phn t ti a c cp pht Tr v 1 nu hai chui ging nhau Tr v 1 nu hai chui khc nhau Tr v iterator u tin ca chui Tr v iterator lp cui cng ca chui Tr v tham chiu n phn t u tin ca chui Tr v tham chiu n phn t cui cng ca chui Hon i 2 chui vi nhau (ging vic hon i gi tr ca 2 bin)

#include <iostream> #include <conio.h> #include <string> using namespace std; int main() { string s = "Hello string"; // Khai bo bin kiu string cout << "Noi dung string: " << s << endl; // In ni dung string ra mn h.nh cout << "Chieu dai cua string: " << s.size() << endl; // Chiu di cout << "Ky tu 0: " << s[0] << endl; // In k t u tin ca xu cout << "Ky tu 1: " << s[1] << endl; // In k t th 2 cout << "Ky tu 2: " << s[2] << endl; // In k t th 3 getchar(); return 0; } Nhp mt string: istream& getline ( istream& in, string& str, char delimiter = \n); c 1 dng v n bn t i tng nhp (istream) in (c th l file hay i tng chun cin) tng k t n khi k t delimiter c nhp v o ( mc nh l \n ) (thng c dng thay cho cin >> khi nhp chui c k t space).C th dng kt hp vi ton t >> // getline with strings #include <iostream> #include <string> using namespace std; int main () { string str; short age; cout << "Please enter full name and age"<< endl;

3 | C++ string
getline( cin, str) >> age; cout << "Thank you " << str << "!\n"; return 0; } b) Cc phng thc chn, xa, ly chui con: Phng thc substr(int pos, int nchar) trch ra chui con ca mt chui cho trc, v d str.substr(2,4) tr v chui con gm 4 k t ca chui str k t k t v tr th 2 (k t u tin ca chui v tr 0). //get substring #include <iostream> #include <string> #include <conio.h> using namespace std; int main () { string s="ConCho chay qua rao"; cout << s.substr(2,4) << endl; // cout << new string(str.begin()+2, str.begin()+2+4); getchar(); return 0; } Phng thc insert( ) chn thm k t hay chui vo mt v tr no ca chui str cho trc. C nhiu cch dng phng thc ny: str.insert(int pos, char* s; str.insert(int pos, string s); str.insert(int pos, int n, int ch); // inserting into a string #include <iostream> #include <string> #include <conio.h> using namespace std; int main () { string str="day la .. xau thu"; string istr = "them"; str.insert(8, istr); cout << str << endl; getchar(); return 0; } Phng thc str.erase(int pos, int n) xa n k t ca chui str k t v tr pos; nu khng quy nh gi tr n th tt c cc k t ca str t v tr pos tr i s b xa // erase from a string #include <iostream> #include <string> #include <conio.h> using namespace std; int main () { string str="day cung la xau thu"; str.erase(0, 3); // " cung la xau thu" cout << str << endl; str.erase(6, 2); cout << str << endl; // " cung xau thu" getchar(); chn s (mng k t kt thc \0) vo v tr pos ca str; chn chui s (kiu string) vo v tr pos ca chui str; chn n ln k t ch vo v tr pos ca chui str;

4 | C++ string
return 0; } c) So snh Bn c th n gin l s dng nhng ton t quan h ( ==, !=, <, <=, >= ) c nh ngha sn. Tuy nhin, nu mun so snh mt phn ca mt chui th s cn s dng phng thc compare(): int compare ( const string& str ) const; int compare ( const char* s ) const; int compare ( size_t pos1, size_t n1, const string& str ) const; int compare ( size_t pos1, size_t n1, const char* s) const; int compare ( size_t pos1, size_t n1, const string& str, size_t pos2, size_t n2 ) const; int compare ( size_t pos1, size_t n1, const char* s, size_t n2) const; Hm tr v 0 khi hai chui bng nhau v ln hn hoc nh hn 0 cho trng hp khc V d: // comparing apples with apples #include <iostream> #include <string> using namespace std; int main () { string str1 ("green apple"); string str2 ("red apple"); if (str1.compare(str2) != 0) cout << str1 << " is not " << str2 << "\n"; if (str1.compare(6,5,"apple") == 0) cout << "still, " << str1 << " is an apple\n"; if (str2.compare(str2.size()-5,5,"apple") == 0) cout << "and " << str2 << " is also an apple\n"; if (str1.compare(6,5,str2,4,5) == 0) cout << "therefore, both are apples\n"; return 0; } d) Cc phng thc tm kim v thay th Phng thc find( ) tm kim xem mt k t hay mt chui no c xut hin trong mt chui str cho trc hay khng. C nhiu cch dng phng thc ny: str.find(int ch, int pos = 0); str.find(char *s, int pos = 0); str.find(string& s, int pos = 0); tm k t ch k t v tr pos n cui chui str tm s (mng k t kt thc \0) k t v tr pos n cui tm chui s k t v tr pos n cui chui.

Nu khng quy nh gi tr pos th hiu mc nhin l 0; nu tm c th phng thc tr v v tr xut hin u tin, ngc li tr v gi tr -1. //find substring #include <iostream> #include <string> #include <conio.h> using namespace std; int main () { string str="ConCho chay qua rao"; cout << str.find("chay") << endl; // 7

5 | C++ string
cout << (int)str.find("Chay") << endl; // -1 getchar(); return 0; } Hm tm kim ngc (rfind) //find from back #include <iostream> #include <string> #include <conio.h> using namespace std; int main () { string str="ConCho chay qua chay qua rao"; cout << str.find("chay") << endl; // 7 cout << (int)str.rfind("chay") << endl; // 16 getchar(); return 0; } Phng thc replace( ) thay th mt on con trong chui str cho trc (on con k t mt v tr pos v m ti nchar k t k t v pha cui chui) bi mt chui s no , hoc bi n k t ch no . C nhiu cch dng, th t tham s nh sau: str.replace(int pos, int nchar, char *s); str.replace(int pos, int nchar, string s); str.replace(int pos, int nchar, int n, int ch); // replace from a string #include <iostream> #include <string> #include <conio.h> using namespace std; int main () { string str="con cho la con cho con. Con meo ko phai la con cho"; str.replace(4, 3, "CHO"); // "con CHO la con cho con. Con meo ko phai la con cho"; cout << str << endl; getchar(); return 0; }

e) Tch xu Trong vic x l xu k t, khng th thiu c cc thao tc tch xu k t thnh nhiu xu k t con thng qua cc k t ngn cch. Cc hm ny c sn trong cc ngn ng khc nh Visual Basic,Java, hay thm ch l trong <string.h> (khng phi <string>) Vi STL, cc bn c th d dng t xy dng mt hm vi chc nng tng t: #include <iostream> #include <vector>Lp tr.nh C++ Nguyn Ph Qung #include <stdio.h> #include <string> using namespace std; int main() { string S = "Xin chao tat ca cac ban"; // Khi to gi tr ca xu string::iterator t, t2; // Cc bin lp vector<string> split; // Mng cc xu (lu kt qu tch)

6 | C++ string
for (t=S.begin(); t<S.end();) { // Lp t v tr bt u t2=find(t, S.end(), ' '); // Tm k t space ' ' u tin // k t v tr t if (t!=t2) split.push_back(string(t, t2)); // Ly xu k t gia 2 v tr t = t2+1; // Chuyn sang v tr sau } for (int i=0; i<splitsize(); i++) cout << split[i] << endl; // In mng cc xu k t getchar(); return 0; } Output: Xin chao tat ca cac ban on chng tr.nh s dng cc k thut sau - Phng thc find(v_tr_u, v_tr_cui, k_t_tm) dng tm v tr u tin ca k_t_tm bt u t v_tr_u. Hm ny tr v v tr ca k t tm c (nu tm thy) hoc v_tr_cui (nu khng tm thy) - string c th khi to t mt on k t con ca mt xu k t khc vi c php string(v_tr_u, v_tr_cui) - on chng tr.nh thc hin tch cc xu k t k c trong trng hp c nhiu k t space nm lin tip nhau.

Mt cch n gin hn l bn c th gi hm strtok() trong string.h lm vic ny, nhng khng may l hm ny thao tc trn char* ch khng phi string. Hm thnh vin c_str() s gip bn chuyn t string thnh dng C-string: const charT* c_str ( ) const; Hm ny cng t ng sinh ra k t null chn vo cui xu. T prototype ta cng thy c hm tr v mt hng chui, iu ny ng ngha vi vic ta khng th thay i chui tr v. Gi phng thc c_str(); string s = "some_string"; cout << s.c_str() << endl; cout << strlen(s.c_str()) << endl; Sau y l v d bn trn c vit li dng hm thnh vin c_str() v cc hm trong <string.h> // strings vs c-strings #include <iostream> #include <string.h> #include <string> using std::string; int main () { char * cstr, *p; string str ("Xin chao tat ca cac ban"); cstr = new char [str.size()+1];

7 | C++ string
strcpy (cstr, str.c_str()); // cstr l 1 bn sao c-string ca str p=strtok (cstr," "); while (p!=NULL) { cout << p << endl; p=strtok(NULL," "); } delete[] cstr; return 0; } Output: Xin chao tat ca cac ban

f)

Chuyn i hng lot vi transform OutputIterator transform( InputIterator first, InputIterator last, OutputIterator result, UnaryOperation unary_op

);

#include <cctype> // for toupper #include <string> #include <algorithm> //for transform using namespace std; char alphabet(char c) { static char ch = 'a'; return ch++; } int main() { string s("this is a lower case string"); transform(s.begin(), s.end(), s.begin(), toupper); cout << s << endl; transform(s.begin(), s.end(), s.begin(), alphabet); cout << s; return 0; }

g) Mt s phng thc khc Cn nhiu phng thc tin ch khc nh: append(), rfind(), find_first_not_of(), find_last_not_of(), swap(). Cch dng cc hm ny u c trnh by trong h thng hng dn (help) ca cc mi trng c h tr STL (trong VC++ l MSDN). Ngoi ra cc phng thc nh find_first_of() tng t nh find(), find_last_of() tng t nh rfind().

You might also like