You are on page 1of 27

1 | C - s t r i n g v s S T L s t r i n g

Tng kt v k t v xu k t
I.Kiu k t char
Gi tr nguyn biu din di dng mt k t vit trong 2 du nhy
vd: 'z'=122 l gi tr nguyn ca k t z (k t th 122 trong !ng "# $%&''(
Cc hm lin quan dn kiu char doc djnh ngha trong ctype.h
Nhn dng cc k t:
int isalnum (char c); l s hoc ch
int isalpha (char c); l ch ci
int isascii (char c); l mt k t trn bn phm (m ASC <=128)
int iscntrl (char c); l mt k t diu khin (c m qut bn phm)
Cc k t diu khin (Control Character) nm t 0x00 dn 0x1F v thm 0x7F
int isdigit (char c); l ch s
int isgraph (char c); l Graphical Character.Bt c k t no c th in ra doc (printable character) du goi l
Graphical Character, ngoi tr k t <space>
int islower (char c); l ch vit thng
int isprint (char c); l k t in doc, bao gm Graphical Character v k t trng <space>
int ispunct (char c); l du cu
int isspace (char c); l k t phn cch (space,tab,enter...)
int isupper (char c); l ch vit hoa
int isxdigit(char c); l ch s thp luc phn ('0'..'9','A'..'F','a'..'f')
#include <iostream>
#include <ctype.h>
void main()
{
char c;
cout << "Nhap 1 ky tu:";cin >> c;
if (isdigit(c)) cout << "mot so !";
else if (isalpha(c) )
{
cout << "mot chu ";
if ( isupper(c) ) cout << "viet hoa !";
else cout << "viet thuong !";
}
getch();
}
Cc k t iu khin
L nhng k t m khng th doc vit bt k du khc trong chong trnh nh l m xung dng (\n) hay tab
(\t). Tt c du bt du bng du x ngoc (\). Sau dy l danh sch cc m diu khin v ngha ca n:
\n xung dng
\r li v du dng
\t k t tab
\ cn thng theo chiu doc
\! backspace
\" sang trang
\a Ku bp
\# du nhy don
2 | C - s t r i n g v s S T L s t r i n g
\$ du nhy kp
\ du hi
\\ k t x ngoc
Chuyn %i ca&' c(a k) t *Charact'r Ca&' C+n'r&i+n,
int tolower (char c);
//chuyen sang chu hoa
int toupper (char c);
//chuyen sang chu thuong
V du:
char c = 'A';
c=tolower(c);
cout << "\nAfter 1st-case-conversion : " << c;
cout << "\nAfter 2nd-case-conversion : " << (char)toupper(c) << endl;
//vi kieu tra ve la int nen phai ep kieu char de in ra ky tu
Kt qu:
After 1st-case-conversion : a
After 2nd-case-conversion : A
II.-.u k t *&tring,
L mng 1 chiu gm cc phn t c kiu char nh mu t, con s v bt c k t dc bit nh +, -, *, /, $, #.
Vit trong cp nhy kp, v du: " like C++"
Theo quy c, mt xu s doc kt thc bi k t nu// ('\0' : k t rng).
Xu l mt con tr (pointer) tr dn k t du tin ca xu (ging nh vi mng)
V du: xu s="nfoworld"; doc lu tr nh sau:
Trong d con tr s tr dn k t du tin ''
Kt thc bng nu// nh vy rt khc so vi cc ngn ng khc. V du, trong Pascal, mi chui k t bao gm mt
mng k t v l)ngth yt) cha chiu di chui. Cu trc ny gip Pascal d dng tr v d di chui khi doc
yu cu. Khi d, Pascal chi vic tr v gi trj l)ngth yt), trong khi C phi dm cho ti khi n gp k t #\0#. y l
l do khin C chm hon Pascal trong mt vi tnh hung nht djnh.
1.Gn gi tr ch+ 2.u *&tring a&&ign3'nt,
Mng ca k t:
char color = "blue";
Bin con tr char*
char*colorPtr = "blue";
t*o con tr+ color,tr tr+ -.n ch/ trong 01u 2lu)2 (2lu)2 3 trong !ng chu4i h5ng(
Khi to chui nh mng:
char color = { 'b', 'l', 'u', 'e', '\0' };
Cn phi nhc nh bn rng vic gn nhiu hng nh vic s dung du ngoc kp (") chi hop l khi khi to
mng,
tc l lc khai bo mng. Cc biu thc trong chong trnh nh sau l khng hop l:
3 | C - s t r i n g v s S T L s t r i n g
//char mystring;
mystring = "ello";
mystring =
"ello";
mystring = { '', 'e', 'l', 'l', 'o', '\0'
};
Chng ta chi c th "gn" nhiu hng cho mt mng vo lc khi to n. Nguyn nhn l mt thao tc gn (=)
khng th nhn v tri l c mt mng m chi c th nhn mt trong nhng phn t ca n. Vo thi dim khi to
mng l mt trng hop dc bit, v n khng thc s l mt lnh gn mc d n s dung du (=).
Tuy nhin C++ cho php ta gn 2 mng tnh c cng kch thc nh
sau:
char a="ello",
b;
//hello v k t null tng cng k
t
//khai bo nh trn th 2 mng tnh c cng kch
thc b=a;
Php gn ny tong dong don chong trnh
sau:
int i=0;
while ( ai <= )
bi=ai++;
Thit lp n k t du ca xu s bng k t c bng 1 trong 2 hm
sau:
void strnset( char s, char c, int
n):
void memset(char *es, int c, siet
n);
4.Nh5ng chu6i h7ng
Bn hy th hai don chong trnh
sau:
char *s="hello";
cout << s;
v:
char s100;
strcpy(s,"hello")
; cout << s;
ai doan m trn da ra cng mt kt qa, nhng cch hoat dng ca chng han tan khc nhau. Trong doan
2, bn khng th vit &89h'//+9:. hiu s khc nhau, bn cn phi bit hoat dng ca !ng chu4i h5ng
(string constant table) trong C.
Khi chong trnh doc thc thi, trnh bin djch to ra mt file obect, cha m my v mt bng cha tt c cc
chui hng khai bo trong chong trnh. Trong doan 1, lnh & 8 9h'//+9: xc djnh rng & chi dn dja chi ca
chui h'//+ trong bng chui hng. Bi v chui ny nm trong bng chui hng, v l mt b phn trong m exe,
nn bn khng th thay di doc n. Bn chi c th dng n theo kiu chi-doc (read-only). minh hoa, bn c
th chn thm cu lnh strcpy(s,"modify"); vo sau lnh gn v du 1, trnh bin dich s bo li ghi vo hng.
Trong doan 2, chui h'//+ cng tn ti trong bng chui hng, do d bn c th copy n vo mng k t tn l &.
Bi
v s khng phi l mt con tr, lnh &89h'//+9: s khng lm
vic.
;.<=c chu6i
4 | C - s t r i n g v s S T L s t r i n g
oc d liu cho mng k t:
char word20;
cin >> word;
- oc xu khng chp nhn khong trng.
- Xu c th vot qu kch thc mng.
cin >> setw( 20 ) >> word; // doc 19 ky tu (1 de danh cho '\0')
oc xu vi khong trng dng 1 trong cc c php sau:
gets(array);// trong stdio.h, khng doc khuyn khch s dung
cin.get(array);
cin.get(array,sie);
cin.getline(array,delimiter='\n');
//ky tu delimiter mac dinh la '\n' - xuong
dong cin.getline(array, sie, delimiter='\n');
Lu input vo mng array dn khi xy ra mt trong hai trng hop
+ Kch thc d liu dt dn sie 1
+ K t delimiter doc nhp vo
67u :delimiter='\n' th8 d9u = l tha" :; "<c -nh trong &==> tc l n.u kh?ng c@ tha" :; ny th8 tr8nh in dch
:A
hiBu l -B "<c -nh
V du:
char sentence 80 ;
cin.getline( sentence, 80);
//dung delimiter mac dinh
i vi cc hm get hay getline ta hon ton c th kt hop vi ton t >> nh th ny:
cout << " Nhap ten, tuoi, nghe nghiep" << endl;
//cin.ignore();
cin.getline( name ) >> age >> ob;
C.u "Dt ch7Eng tr8nh tr)o hay k.t thFc 9t th7Gng khi l" viHc vIi 01u th7Gng l do "Dt :; k t vJn cKn trong
vLng -H"M N.t Ou! l ch7Eng tr8nh c@ vP k.t thFc :I" hEn "ong "u;nM
Q" RRlu:h(( hay cinMignor)(( :A gi!i Ouy.t v9n -S nyM C@ :A l" :*ch vLng -H" v chTU t9t c! nh/ng g8 c@ trong
vLng -H" ra ngoi ( trong vV dW 3 trn th8 n@ kh?ng thXt : cYn thi.t lZ" (
III.>h? i@n 2A / 2.u B&tring.hC
Cung cp cc hm:
Thao tc vi d liu kiu xu
So snh xu
Tm kim trn xu cc k t hoc xu khc
Chia xu thnh cc t t (tokenie strings)
1.DEt &F hG3 cH !In
Chuyn chu6i 2.u &ang ch5 th?Jng
5 | C - s t r i n g v s S T L s t r i n g
char *strlwr(char *s);
V du:
char *s = "Borland C";
s = strlwr(s); //ket qua s = "borland c"
Chuyn chu6i 2.u &ang ch5 h+a
char *strupr(char *s);
V du:
char *s = "Borland C";
s = strlwr(s); //ket qua s = "BLAN C"
-c nh E dGi 2.u
siet strlen( const char *s )
//tra ve so ky tu cua xau khong tinh den ky tu '\0'
V du:
char s = "This is a string";
cout << "The string is include: " << strlen(s) << " characters\n";
getch();
4.C+Ky 2.u
Xt v du sau:
#include <iostream.h>
void main()
{
char a="ello",*b="orld";
b=a;//vn d dy
a0 = '0';
cout << a << " " << b;
//d djnh in ra 0ello ello
}
Kt qu:
0ello 0ello
Vn d ca xu k t: xu thc cht l 1 con tr tham chiu ti vng nh c cha ni dung nn s xy ra tnh
trng nh hnh v di vi php gn:
6 | C - s t r i n g v s S T L s t r i n g
l l do khi thay di xu a ta li nhn doc s thay di trn c a v b.
y l diu m chng ta khng mun.Gii php dng cho trng hop ny l sao chp ni dung bng 1 vng
while()
//char *a="ello",b="orld";
int i=0;
while ( ai != NLL )
bi=ai++;
bi=ai;//ky tu null
Nhng tin hon l dng hm chun:
char *strcpy( char *s1, const char *s2 );
-Copy tham s th hai vo tham s th nht
Tham s th nht phi c kch thc d ln d cha xu v k t null
char *strncpy( char *s1, const char *s2, siet n );
- Xc djnh r s k t doc copy t xu vo mng
- Khng nht thit copy k t null
#include <iostream>
#include <conio.h>
#include <string>
//chua prototypes (khai bao) strcpy strncpy
void main()
{
char x = "appy Birthday to ou";
char y 2 ;
char 1 ;
strcpy( y, x ); // copy contents of x into y
cout << "The string in array x is: " << x<< "\nThe string in array y is: " << y << '\n';
// copy 1 ky tu dau tien tu x vao
strncpy( , x, 1 ); // khong copy ky tu
'\0' 1 = '\0'; //ghi them '\0'
cout << "The string in array is: " << << endl;
getch();
}
Kt qu:
The string in array x is: appy Birthday to
ou The string in array y is: appy Birthday
to ou The string in array is: appy
Birthday
;.NFi 2.u *C+ncat'nating &tring&,
char *strcat( char *s1, const char *s2 )
- Ni xu th hai vo sau xu th nht
- K t du tin ca tham s th hai thay th k t null ca tham s th nht
- Phi chc chn rng tham s th nht c kch thc d ln d cha thm phn ni vo v k t null kt thc xu.
7 | C - s t r i n g v s S T L s t r i n g
char *strncat( char *s1, const char *s2, siet n )
- Thm n k t ca tham s th hai vo sau tham s th nht
- Thm k t null vo kt qu
void main()
{
char s1 20 = "appy ";
char s2 = "New ear ";
char s 0 = "";
cout << "s1 = " << s1 << "\ns2 = " <<
s2;
strcat( s1, s2 ); // them s2 vao sau
s1
cout << "\n\nAfter strcat(s1, s2):\ns1 = " << s1 << "\ns2 = " <<
s2;
strncat( s, s1,
);
// them ky tu dau tien cua s1 vao sau s, ghi '\0' vao
cuoi
cout << "\n\nAfter strncat(s, s1, ):\ns1 = " << s1 << "\ns = " <<
s;
strcat( s, s1 ); // them s1 vao sau
s
cout << "\n\nAfter strcat(s, s1):\ns1 = " << s1 << "\ns = " <<
s
<< endl;
getch();
}
Kt qu:
s1 = appy
s2 = New ear
After strcat(s1, s2):
s1 = appy New ear
s2 = New ear
After strncat(s, s1,
): s1 = appy New
ear s = appy
After strcat(s, s1):
s1 = appy New ear
s = appy appy New ear
L.M+ &nh 2.u *c+3Karing &tring&,
Cc k t doc biu din bng m dng s (numeric code), cc m d doc dng d so snh cc xu k
t
Cc hm so snh xu:
int strcmp( const char *s1, const char *s2 )
//phan biet chu hoa chu thuong
int strcmpi( const char *s1, const char *s2)
//khong phan biet chu hoa chu thuong
+So snh tng k t mt, theo th t t din
+Tr v
(+) 0 nu xu bng nhau
(+) gi trj m nu xu th nht nh hon xu th hai
(+) gi trj dong nu xu th nht ln hon xu th hai
int strncmp( const char *s1, const char *s2, siet n );
int strncmpi( const char *s1, const char *s2, siet n );
8 | C - s t r i n g v s S T L s t r i n g
- So snh n k t du tin
- ng so snh nu gp k t null ca 1 trong 2 tham s
void main()
{
char *s1 = "appy New
ear"; char *s2 = "appy
New ear"; char *s =
"appy olidays";
cout << "s1 = " << s1 << "\ns2 = " <<
s2
<< "\ns = " << s << "\n\nstrcmp(s1, s2) =
"
<< setw( 2 ) << strcmp( s1, s2
)
<< "\nstrcmp(s1, s) = " << setw( 2
)
<< strcmp( s1, s ) << "\nstrcmp(s, s1) =
"
<< setw( 2 ) << strcmp( s, s1
);
cout << "\n\nstrncmp(s1, s, ) = " << setw( 2 )
<< strncmp( s1, s, ) << "\nstrncmp(s1, s, 7) = "
<< setw( 2 ) << strncmp( s1, s, 7 )
<< "\nstrncmp(s, s1, 7) = "
<< setw( 2 ) << strncmp( s, s1, 7 ) << endl;
getch();
}
Kt qu:
s1 = appy New ear
s2 = appy New
ear s = appy
olidays
strcmp(s1, s2) = 0
strcmp(s1, s) = 1
strcmp(s, s1) = -1
strncmp(s1, s, ) = 0
strncmp(s1, s, 7) = 1
strncmp(s, s1, 7) = -1
N.>O3 kiP3 nEi dung 2.u k t
Q" :trchr(( -7[c :\ dWng -B t8" ki." : 0u9t hiHn -Yu tin ca k t c trong chu4i :trM
Q" :tr:tr(( -7[c :\ dWng -B t8" ki." : 0u9t hiHn -Yu tin ca chu4i :2 trong chu4i :1M
char *strchr(const char *str, int c)
- Nu k t d chi djnh khng c trong chui, kt qu tr v l NLL.
- Kt qu tr v ca hm l mt con tr trQ Pn k t c ?Rc tO3 thSy Tu tin trong chui str.
char*strstr(const char *s1, const char *s2)
Kt qu tr v ca hm l mt con tr trQ Pn KhTn tA Tu tin c(a chu6i &1 cU chVa chu6i &4 hoc gi trj
NLL
nu chui s2 khng c trong chui s1.
V du: Vit chong trnh s dung hm strstr() d ly ra mt phn ca chui gc bt du t chui hoc.
void main()
{
char Chuoi2,*s;
9 | C - s t r i n g v s S T L s t r i n g
cout << "Nhap chuoi: ";
cin.get(Chuoi);
s=strstr(Chuoi,hoc);
cout << Chuoi trich ra: << s;
getch();
}
siet strcspn( const char *str1, const char *str2 );
Tr v vj tr du tin ca bt c k t no trong 'str1' tm thy trong
'str2' Nu khng tm thy th tr v d di chui str1
void main()
{
const char *str="Xcross87 ";
char *key="12789";
int pos = strcspn(str,key);
cout << "tim thay o vi tri" << pos;
getch();
}
siet strspn( const char *str1, const char *str2 );
Tr v vj tr ca k t du tin trong chui str1 m khng khp str2
char* strpbrk( const char* str1, const char* str2 );
Tr v con tr tr dn k t xut hin du tin trong 'str1' xut hin trong 'str2'.
Tr v NLL nu khng tm thy.
void main()
{
const char *str1="con ga trong ko phai la con ga mai";
const char *str2="129a";
char* found;
found = strpbrk(str1,str2);
if (NLL != found) cout << " Tim thay ki tu dau tien: " << *found;
getch();
}
W.<I+ ng?Rc 2.u : char *strrev(char *s);
char s="129a";
cout << strrev(s);
Kt qu:
a921
X.Yh.n t)ch tZ tF *t+k'ni[ing,
Chia xu thnh cc t t, phn tch bi cc k t ngn cch (delimiting character)
vd: 2]hi: i: "y :tring2 c@ ^ t_ t; (tch nhau 3i cc d9u tr;ng(
char *strtok( char *s1, const char *s2 )
10 | C - s t r i n g v s S T L s t r i n g
+Cn goi nhiu ln
(+)Ln goi du cn 2 tham s,xu cn phn tch t t v xu cha cc k t ngn cch
(+)Nhng li goi tip theo s dung di s th nht l NLL, tip tuc phn tch t t trn xu d
+Kt qu tr v ca hm l mt xu - t t hoc gi trj NLL nu d duyt ht.
void main()
{
char sentence = "This is a sentence with 7 tokens";
char *tokenPtr;
cout << "The string to be tokenied is:\n" << sentence
<< "\n\nThe tokens are:\n\n";
// Loi goi strtok dau tien khoi dau viec phan tich tu
tokenPtr = strtok( sentence, " " );
// Cac loi goi strtok tiep sau
//voi NLL l doi so thu nhat de tiep tuc viec phan tich tu
to while ( tokenPtr != NLL )
{
cout << tokenPtr << '\n';
tokenPtr = strtok( NLL, " " ); //lay token tiep theo
} // end while
cout << "\nAfter strtok, sentence = " << sentence << endl;
getch();
}
Kt qu:
The string to be tokenied is:
This is a sentence with 7
tokens
The tokens are:
This
is
a
sentence
with
7
tokens
After strtok, sentence = This
I\.Cc chVc n]ng khc
>ha+ tc hGng /+t ^i 2.u
m transform() trong th vin <algorithm> ca C++
void*transform(void*vj tr bt du, void* vj
tr kt thc, void*mng dch
lu kt qu, con tr hm
chuyn di);
V du:
#include <ctype.h> // for toupper
#include <algorithm> // for transform
#include <iostream>
11 | C - s t r i n g v s S T L s t r i n g
using namespace std;
char alphabet(char c)
{
static char ch = 'a';
return ch++;
}
int main()
{
char s = "this is a lower case string";
transform(s, s + sieof(s), s, toupper);
cout << s << endl;
transform(s, s + sieof(s), s, alphabet);
cout << s;
return 0;
}
Cc hG3 chuyn %i d5 /i@u ^i 2.u
Chuyn di 1 chui sang gi trj int.
int atoi(const char *s);
int atol(const char *s);
//tuong tu atoi() nhung su dung voi kieu long
//phai khai bao stdlib.h
V du:
int i;
char *str = "12.7";
i = atoi(str);
//ket qua i = 12
Chuyn di 1 chui sang gi trj long
long strtol( const char *start, char **end, int base );
start l chui du vo ca convert, end l phn cn li ca chui sau khi convert, base l co s ca chui nhp
vo convert thnh cng th tr v s double d convert
nu tht bi th tr v: 0.0
void main ()
{
char *start="12f.asyglg";
char *end;
long result;
result = strtol(start,end,1);
cout << "Sau khi convert: ";
cout << "\n start = " << start;
cout << "\n end = " << end;
cout << "\n result = " <<
result;
getch();
}
12 | C - s t r i n g v s S T L s t r i n g
unsigned long strtoul( const char *start, char **end, int base );
//giong nhu tren nhung la kieu long khong dau
Chuyn di 1 chui sang gi trj double
double atof(const char *s);
,h!i khai o "athMh ho<c :tdliMh
V du:
float f;
char *str = "12.7";
f = atof(str);
//ket qua f = 12.7;
double strtod( const char *start, char *end );
//su dung giong strtol()
nu tht bi th tr v: 0.0
nu convert thnh cng m kt qu li qu to so vi gii hn ca double th gi hn doc tr v.
Chuyn di s nguyn value sang chui string theo co s
radix. char *itoa(int value, char *string, int radix);
,h!i khai o :tdliMh
V du:
int number = 12;
char string2;
itoa(number, string, 10);
//chuyen doi number sang chuoi theo co so 10
//ket qua string =
"12" itoa(number,
string, 2);
//chuyen doi number sang chuoi theo co so 2
//ket qua string = "11000000111001"
\.Ch_ &A d`ng 2.u ^i cSK Kht Eng
1.GiI &A cU ch?Hng trOnh &au:
int main()
{
char *s;
s= new char100;
s="hello";
delete s;
return 0;
}
on trn djch tt, nhng khi chy th bj li segmentation fault dng delete.Ton t new cp pht mt khi 100
bytes v tr s ti d, nhng sau d, lnh s="hello"; gy ra li. V c php th lnh ny khng sai, v s l mt con tr;
tuy nhin khi lnh s="hello"; doc thc thi, s tr ti mt chui trong bng chui hng (string constant table) v khi
b nh cp pht trc d "bo vo" (memory leak).V s tr dn mt chui trong bng chui hng, m chui ny
khng th thay di, nn delete khng thc hin doc vic gii phng b nh.
Chong trnh trn cn phi sa li thnh:
13 | C - s t r i n g v s S T L s t r i n g
int main()
{
char *s;
s= new char100;
strcpy(s,"hello");
delete s;
return 0;
}
4.-'3 +n 3a &au .y:
char *p, buf 2 ;
gets( buf );
p = new charstrlen(buf);
strcpy( p, buf );
on m trn sai ch: m strlen() khng tnh dn k t null cui xu, trong khi hm strcpy vn sao chp k
t null cui xu ngun sang xu dch. Kt qu l strcpy ghi k t null ra ngoi vng nh doc cp pht cho
p.Sa li l:
p = new char strlen( buf ) + 1 ;
strcpy( p, buf );
u ht cc mi trng pht trin C v C++ du cung cp mt hm c tn l strdup(). m ny s dung malloc() v
strcpy() d to ra mt bn sao ca xu, nh d trnh doc li ni trn. Tht khng may, strdup() li khng phi l
mt hm chun ca ANS C.
\I.Chu6i tr+ng Cbb
1.Kiu chu6i c(a C G hn chP
Khi mi hoc C, chc cc bn du rt bi ri khi lm vic vi xu k t, vic s dung 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 chong trnh C++ c th s dung chui theo cch thc c ca Cg?n ng/ &: mng cc k t kt thc bi
k t m ASC 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 dng 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 chong trnh mi trnh doc cc li v k thut;
- Khng th gn gi trj hay s dung php ton + (ghp chui) v cc php ton so snh nh: > (ln hon),
<
(nh hon),. m phi goi cc hm th vin trong <string.h>;
- Nu dng k thut cp pht dng 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) d trnh vic cn kit b nh ca my tnh trong
trng hop c nhiu chong trnh hot dng dng thi.
4.Kiu &tring tr+ng th? i@n M>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 chi thj #include cn khai bo d s dung string :
#include <string>//chu y khong co .h
using std::string;
//using namespace std;
14 | C - s t r i n g v s S T L s t r i n g
;.Cc Kh?Hng thVcd KheK t+n ti@n )ch c(a kiu
&tring
Kiu string ca STL h tro cc nhm phong thc v php ton tin ch sau dy.
a) Cc php ton v phong thc co bn
Cc ton t +, += dng d ghp hai chui v cng d ghp mt k t vo chui;
Cc php so snh theo th t t din: == (bng nhau), != (khc nhau), > (ln hon), >= (ln hon hay bng),
< (nh hon), <= (nh hon hay bng);
Phong thc length( ) v php ly chi s d duyt tng k t ca chui: nu s l bin kiu string th si
l k t th i ca s vi 0 i <s.length( );
Php gn (=) dng d gn bin kiu string bng mt chui, hoc bng string khc, chng hn:
string s=ABCF; hay s1=s2; m khng cn copy xu.
Nhng constructor thng s dung nht:
string();
string(const char *str);
string(const string str);
C th dng ton t << vi cout d xut mt chui ra mn hnh hoc dng ton t >> vi cin d nhp
mt chui k t dn khi gp mt khong trng th dng.
char st=ABCF;
string s;
s=X;
cout << s << endl;
s=st;
cout << s.length() << : << s << endl;
//.
Mt vn d thng ny sinh trong cc ng dung c s dung C-string: mt C-String cha khi to cn
doc gn NLL. Tuy nhin, rt nhiu hm th vin ca C-String s gp s c trong thi gian chy khi
gp di tong C-String l NLL. Chng hn, lnh
char* x = NLL;
cout << strlen(x);
doc mt s trnh bin djch chp nhn, nhng vi nhiu hin thc khc ca th vin C-String, th gp
li trong thi gian chy.
string khng gp vn d 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 phong thc v thuc tnh, do d, n c ton
b cc tnh cht ca 1 vector, vd hm sie(), pushback(), ton t .
Phong thc M t
15 | C - s t r i n g v s S T L s t r i n g
v.sie() S long phn t
v.empty () Tr v 1 nu chui rng, 0 nu ngoc li.
v.maxsie() Tr v s long phn t ti da d doc cp pht
v1 == v2 Tr v 1 nu hai chui ging nhau
v1 != v2 Tr v 1 nu hai chui khc nhau
v.begin() Tr v iterator ( 1 loi con tr ) du tin ca chui
v.end() Tr v iterator cui cng ca chui
v.front() Tr v tham chiu dn phn t du tin ca chui
v.back() Tr v tham chiu dn phn t cui cng ca chui
v1.swap(v2) on di 2 chui vi nhau (ging vic hon di gi trj ca 2 bin)
#include <iostream>
#include <conio.h>
#include <string>
using namespace
std; int main()
{
string s = "ello string"; // Khai bo bin kiu string
cout << "Noi dung string: " << s << endl; // n ni dung string ra mn
h.nh cout << "Chieu dai cua string: " << s.sie() << endl;
// Chiu di
cout << "Ky tu 0: " << s0 << endl; // n k t du tin ca
xu cout << "Ky tu 1: " << s1 << endl; // n k t th 2
cout << "Ky tu 2: " << s2 << endl; // n k t th
getchar();
return 0;
}
Nhp mt string: istream getline ( istream in, string str, char delimiter = \n);
oc 1 dng vn bn t di tong nhp (istream) in (c th l file hay di tong chun cin) tng k
t dn khi k t delimiter doc nhp vo ( mc djnh l \n ) (thng doc dng thay cho cin >> khi
nhp chui c k t space).C th dng kt hop vi ton t >>
// getline with strings
#include <iostream>
16 | C - s t r i n g v s S T L s t r i n g
#include <string>
using namespace std;
int main ()
{
string str;
short age;
cout << "Please enter full name and age"<< endl;
getline( cin, str) >> age;
cout << "Thank you " << str << "!\n";
return 0;
}
b) Cc phong thc chn, xa, ly chui con:
Phong thc substr(int pos, int nchar) trch ra chui con ca mt chui cho trc, v du str.substr(2,) tr v
chui con gm k t ca chui str k t k t vj tr th 2 (k t du tin ca chui vj 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,) << endl;
// cout << new string(str.begin()+2, str.begin()+2+);
getchar();
return 0;
}
- Phong thc insert( ) chn thm k t hay chui vo mt vj tr no d ca chui str cho trc. C nhiu cch
dng phong thc ny:
str.insert(int pos, char* s; chn s (mng k t kt thc \0) vo vj tr pos ca
str; str.insert(int pos, string s); chn chui s (kiu string) vo vj tr pos ca chui str;
str.insert(int pos, int n, int ch); chn n ln k t ch vo vj tr pos ca chui str;
// inserting into a string
#include <iostream>
17 | C - s t r i n g v s S T L s t r i n g
#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;
}
- Phong thc str.erase(int pos, int n) xa n k t ca chui str k t vj tr pos; nu khng quy djnh gi trj n
th tt c cc k t ca str t vj tr pos tr di s bj 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, ); // " cung la xau
thu" cout << str << endl;
str.erase(, 2);
cout << str << endl; // " cung xau
thu" getchar();
return 0;
}
c) So snh
Bn c th don gin l s dung nhng ton t quan h ( ==, !=, <, <=, >= ) doc djnh ngha sn. Tuy
nhin, nu mun so snh mt phn ca mt chui th s cn s dung phong thc compare():
18 | C - s t r i n g v s S T L s t r i n g
int compare ( const string str ) const;
int compare ( const char* s ) const;
int compare ( siet pos1, siet n1, const string str ) const;
int compare ( siet pos1, siet n1, const char* s) const;
int compare ( siet pos1, siet n1, const string str, siet pos2, siet n2 ) const;
int compare ( siet pos1, siet n1, const char* s, siet n2) const;
m tr v 0 khi hai chui bng nhau v ln hon hoc nh hon 0 cho trng hop khc
V du:
// 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(,,"apple") == 0)
cout << "still, " << str1 << " is an apple\n";
if (str2.compare(str2.sie()-,,"apple") == 0)
cout << "and " << str2 << " is also an apple\n";
if (str1.compare(,,str2,,) == 0)
cout << "therefore, both are apples\n";
return 0;
}
d) Cc phong thc tm kim v thay th
- Phong thc find( ) tm kim xem mt k t hay mt chui no d c xut hin trong mt chui str cho
trc hay khng. C nhiu cch dng phong thc ny:
str.find(int ch, int pos = 0); tm k t ch k t vj tr pos dn cui chui str
str.find(char *s, int pos = 0); tm s (mng k t kt thc \0) k t vj tr pos dn
cui str.find(string s, int pos = 0); tm chui s k t vj tr pos dn cui chui.
Nu khng quy djnh gi trj pos th hiu mc nhin l 0; nu tm c th phong thc tr v vj tr xut hin du
tin, ngoc li tr v gi trj -1.
19 | C - s t r i n g v s S T L s t r i n g
//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
cout << (int)str.find("Chay") << endl; //
-1 getchar();
return 0;
}
m tm kim ngoc (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; //
1 getchar();
return 0;
}
- Phong thc replace( ) thay th mt don con trong chui str cho trc (don con k t mt vj tr pos v
dm ti nchar k t k t v pha cui chui) bi mt chui s no d, hoc bi n k t ch no d. C
nhiu cch dng, th t tham s nh sau:
20 | C - s t r i n g v s S T L s t r i n g
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(, , "C"); // "con C 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 doc 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,ava, 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 tong t:
#include <iostream>
#include <vector>
#include <stdio.h>
#include <string>
using namespace
std; int main()
{
21 | C - s t r i n g v s S T L s t r i n g
string S = "Xin chao tat ca cac ban"; // Khi to gi trj ca
xu string::iterator t, t2; // Cc bin lp
vector<string> split; // Mng cc xu (lu kt qu tch)
for (t=S.begin(); t<S.end();)
{ // Lp t vj tr bt du
t2=find(t, S.end(), ' '); // Tm k t space ' ' du tin
// k t vj tr t
if (t!=t2) split.pushback(string(t, t2)); // Ly xu k t gia 2 vj
tr t = t2+1; // Chuyn sang vj tr sau
}
for (int i=0; i<splitsie(); i++)
cout << spliti << endl; // n mng cc xu k t
getchar();
return 0;
}
utput:
Xin
chao
tat
ca
cac
ban
on chong tr.nh s dung cc k thut sau
- Phong thc find(vjtrdu, vjtrcui, kttm) dng d tm vj tr du tin ca kttm bt du
t
vjtrdu. m ny tr v vj tr ca k t tm doc (nu tm thy)
hoc vjtrcui (nu khng tm thy)
- string c th khi to t mt don k t con ca mt xu k t khc vi c
php string(vjtrdu, vjtrcui)
- on chong tr.nh thc hin tch cc xu k t k c trong trng hop c nhiu k t
space nm lin tip nhau.
22 | C - s t r i n g v s S T L s t r i n g
Mt cch don gin hon l bn c th goi hm strtok() trong string.h d lm vic ny, nhng khng may l
hm ny thao tc trn char* ch khng phi string. m thnh vin cstr() s gip bn chuyn t string
thnh dng C-string:
const charT* cstr ( ) const;
m ny cng t dng sinh ra k t null chn vo cui xu.
T prototype ta cng thy doc hm tr v mt hng chui, diu ny dng ngha vi vic ta khng th
thay di chui tr v.
Goi phong thc cstr();
string s = "somestring";
cout << s.cstr() << endl;
cout << strlen(s.cstr()) << endl;
Sau dy l v du bn trn doc vit li dng hm thnh vin cstr() 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.sie()+1;
strcpy (cstr, str.cstr());
// cstr l 1 bn sao c-string ca str
p=strtok (cstr," ");
while (p!=NLL)
{
cout << p << endl;
p=strtok(NLL," ");
}
23 | C - s t r i n g v s S T L s t r i n g
delete cstr;
return 0;
}
utput:
Xin
chao
tat
ca
cac
ban
f) Chuyn di hng lot vi transform
utputterator transform( nputterator first,
nputterator last,
utputterator result,
naryperation unaryop );
#include <ctype> // 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;
}
24 | C - s t r i n g v s S T L s t r i n g
g) Mt s phong thc khc
Cn nhiu phong thc tin ch khc nh: append(), rfind(), findfirstnotof(), findlastnotof(), swap().
Cch dng cc hm ny du doc trnh by trong h thng hng dn (help) ca cc mi trng c h
tro STL (trong VC++ l MSN). Ngoi ra cc phong thc nh findfirstof() tong t nh find(),
findlastof() tong t nh rfind().

You might also like