Updatesofts.com Ebooks Team
Trang 48
Xâu kí t
Trong tt c các chương trình chúng ta ñã thy cho ñến gi, chúng ta ch s dng các biến
kiu s, ch dùng ñể biu din các s. Nhưng bên cnh các biến kiu s còn có các xâu kí
t, chúng cho phép chúng ta biu din các chui kí t như là các t, câu, ñon văn bn...
Cho ñến gi chúng ta mi ch dùng chúng dưới dng hng ch cha quan tâm ñến các
biến có th cha chúng.
Trong C++ không có kiu d liu cơ bn ñể lưu các xâu kí t. ðể có th tha mãn nhu
cu này, người ta s dng mng có kiu
char
. Hãy nh rng kiu d liu này (
char
) ch
có th lưu tr mt kí t ñơn, bi vy nó ñược dùng ñể to ra xâu ca các kí t ñơn.
Ví d, mng sau (hay là xâu kí t):
char jenny [20];
có th lưu mt xâu kí t vi ñộ dài cc ñại là 20 kí t. Bn có th tưởng tượng nó như
sau:
Kích thước cc ñại này không cn phi luôn luôn dùng ñến. Ví d,
jenny
có th lưu xâu
"Hello" hay "Merry christmas"
. Vì các mng kí t có th lưu các xâu kí t ngn hơn
ñộ dài ca nó, trong C++ ñã có mt quy ước ñể kết thúc mt ni dung ca mt xâu kí t
bng mt kí t null, có th ñược viết là
'\0'
.
Chúng ta có th biu din
jenny
(mt mng có 20 phn t kiu
char
) khi lưu tr xâu kí
t
"Hello"
"Merry Christmas"
theo cách sau:
Chú ý rng sau ni dung ca xâu, mt kí t null (
'\0'
) ñược dùng ñể báo hiu kết thúc
xâu. Nhng ô màu xám biu din nhng giá tr không xác ñịnh.
Khi to các xâu kí t.
Vì nhng xâu kí t là nhng mng bình thường nên chúng cũng như các mng khác. Ví
d, nếu chúng ta mun khi to mt xâu kí t vi nhng giá tr xác ñịnh chúng ta có th
làm ñiu ñó tương t như vi các mng khác:
Updatesofts.com Ebooks Team
Trang 49
char mystring[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
Tuy nhiên, chúng ta có th khi to giá tr cho mt xâu kí t bng cách khác: s dng các
hng xâu kí t.
Trong các biu thc chúng ta ñã s dng trong các ví d trong các chương trước các hng
xâu kí t ñể xut hin vài ln. Chúng ñược biu din trong cp ngoc kép (
"
), ví d:
"the result is: "
là mt hng xâu kí t chúng ta s dng mt s ch.
Không ging như du nháy ñơn (
'
) cho phép biu din hng kí t, cp ngoc kép (
"
) là
hng biu din mt chui kí t liên tiếp, và cui chui mt kí t null (
'\0'
) luôn ñược
t ñộng thêm vào.
Vì vy chúng ta có th khi to xâu
mystring
theo mt trong hai cách sau ñây:
char mystring [] = { 'H', 'e', 'l', 'l', 'o', '\0' };
char mystring [] = "Hello";
Trong c hai trường hp mng (hay xâu kí t)
mystring
ñược khai báo vi kích thước 6
kí t: 5 kí t biu din
Hello
cng vi mt kí t null.
Trước khi tiếp tc, tôi cn phi nhc nh bn rng vic gán nhiu hng như vic s dng
du ngoc kép (
"
) ch hp l khi khi to mng, tc là lúc khai báo mng. Các biu thc
trong chương trình như:
mystring = "Hello";
mystring[] = "Hello";
là không hp l, c câu lnh dưới ñây cũng vy:
mystring = { 'H', 'e', 'l', 'l', 'o', '\0' };
Vy hãy nh: Chúng ta ch có th "gán" nhiu hng cho mt mng vào lúc khi to nó.
Nguyên nhân là mt thao tác gán (
=
) không th nhn vế trái là c mt mng mà ch có th
nhn mt trong nhng phn t ca nó. Vào thi ñim khi to mng là mt trường hp
ñặc bit, vì nó không thc s là mt lnh gán mc dù nó s dng du bng (
=
).
Gán giá tr cho xâu kí t
Vì vế trái ca mt lnh gán ch có th là mt phn t ca mng ch không th là c mng,
chúng ta có th gán mt xâu kí t cho mt mng kiu
char
s dng mt phương pháp
như sau:
mystring[0] = 'H';
mystring[1] = 'e';
Updatesofts.com Ebooks Team
Trang 50
mystring[2] = 'l';
mystring[3] = 'l';
mystring[4] = 'o';
mystring[5] = '\0';
Nhưng rõ ràng ñây không phi là mt phương pháp thc tế. ðể gán giá tr cho mt xâu kí
t, chúng ta có th s dng lot hàm kiu
strcpy
(string copy), hàm này ñược ñịnh
nghĩa trong
string.h
và có th ñược gi như sau:
strcpy (string1, string2);
Lnh này copy ni dung ca
string2
sang
string1
.
string2
có th là mt mng, con
tr hay mt hng xâu kí t, bi vy lnh sau ñây là mt cách ñúng ñể gán xâu hng
"Hello"
cho
mystring
:
strcpy (mystring, "Hello");
Ví d:
// setting value to string
#include <iostream.h>
#include <string.h>
int main ()
{
char szMyName [20];
strcpy (szMyName,"J. Soulie");
cout << szMyName;
return 0;
}
J. Soulie
ðể ý rng chúng ta phi include file
<string.h>
ñể có th s dng hàm
strcpy
.
Mc dù chúng ta luôn có th viết mt hàm ñơn gin như hàm
setstring
dưới ñây ñể
thc hin mt thao tác ging như
strcpy
:
// setting value to string
#include <iostream.h>
void setstring (char szOut [], char
szIn [])
{
int n=0;
do {
szOut[n] = szIn[n];
n++;
} while (szIn[n] != 0);
}
int main ()
J. Soulie
Updatesofts.com Ebooks Team
Trang 51
{
char szMyName [20];
setstring (szMyName,"J. Soulie");
cout << szMyName;
return 0;
}
Mt phương thc thường dùng khác ñể gán giá tr cho mt mng là s dng trc tiếp
dòng nhp d liu (
cin
). Trong trường hp này giá tr ca xâu kí t ñược gán bi người
dùng trong quá trình chương trình thc hin.
Khi
cin
ñược s dng vi các xâu kí t nó thường ñược dùng vi phương thc
getline
ca nó, phương thc này có th ñược gi như sau:
cin.getline ( char buffer[], int length, char delimiter = ' \n');
trong ñó
buffer
(b ñệm) là ñịa ch nơi s lưu tr d liu vào (như là mt mng chng
hn),
length
ñộ dài cc ñại ca b ñệm (kích thước ca mng) và
delimiter
là kí t
ñược dùng ñể kết thúc vic nhp, mc ñịnh - nếu chúng ta không dùng tham s này - s
kí t xung dòng (
'\n'
).
Ví d sau ñây lp li tt c nhng gì bn gõ trên bàn phím. Nó rt ñơn gin nhưng là mt
ví d cho thy bn có th s dng
cin.getline
vi các xâu kí t như thế nào:
// cin with strings
#include <iostream.h>
int main ()
{
char mybuffer [100];
cout << "What's your name? ";
cin.getline (mybuffer,100);
cout << "Hello " << mybuffer <<
".\n";
cout << "Which is your favourite
team? ";
cin.getline (mybuffer,100);
cout << "I like " << mybuffer <<
" too.\n";
return 0;
}
What's your name? Juan
Hello Juan.
Which is your favourite team? Inter
Milan
I like Inter Milan too.
Chú ý trong c hai li gi
cin.getline
chúng ta s dng cùng mt biến xâu (
mybuffer
).
Nhng gì chương trình làm trong li gi th hai ñơn gin là thay thế ni dung ca
buffer
trong li gi cũ bng ni dung mi.
Nếu bn còn nh phn nói v giao tiếp vi, bn s nh rng chúng ta ñã s dng toán t
>>
ñể nhn d liu trc tiếp t ñầu vào chun. Phương thc này có th ñược dùng vi các
Updatesofts.com Ebooks Team
Trang 52
xâu kí t thay cho
cin.getline
. Ví d, trong chươn trình ca chúng ta, khi chúng ta
mun nhn d liu t người dùng chúng ta có th viết:
cin >> mybuffer;
lnh này s làm vic như nó có nhng hn chế sau mà
cin.getline
không có:
Nó ch có th nhn nhng t ñơn (không nhn ñược c câu) vì phương thc này
s dng kí t trng(bao gm c du cách, du tab và du xung dòng) làm du
hiu kết thúc..
Nó không cho phép ch ñịnh kích thước cho b ñệm. Chương trình ca bn có th
chy không n ñịnh nếu d liu vào ln hơn kích c ca mng cha nó.
Vì nhng nguyên nhân trên, khi mun nhp vào các xâu kí t bn nên s dng
cin.getline
thay vì
cin >>
.
Chuyn ñổi xâu kí t sang các kiu khác.
Vì mt xâu kí t có th biu din nhiu kiu d liu khác như dng s nên vic chuyn
ñổi ni dung như vy sang dng s là rt hu ích. Ví d, mt xâu có th mang giá tr
"1977"
nhưng ñó là mt chui gm 5 kí t (k c kí t null) và không d gì chuyn thành
mt s nguyên. Vì vy thư vin
cstdlib
(
stdlib.h
) ñã cung cp 3 macro/hàm hu ích
sau:
atoi: chuyn xâu thành kiu
int
.
atol: chuyn xâu thành kiu
long
.
atof: chuyn xâu thành kiu
float
.
Tt c các hàm này nhn mt tham s và tr v giá tr s (
int
,
long
hoc
float
). Các
hàm này khi kết hp vi phương thc
getline
ca
cin
là mt cách ñáng tin cy hơn
phương thc
cin>>
c ñin khi yêu cu người s dng nhp vào mt s:
// cin and ato* functions
#include <iostream.h>
#include <stdlib.h>
int main ()
{
char mybuffer [100];
float price;
int quantity;
cout << "Enter price: ";
cin.getline (mybuffer,100);
price = atof (mybuffer);
cout << "Enter quantity: ";
cin.getline (mybuffer,100);
quantity = atoi (mybuffer);
cout << "Total price: " <<
price*quantity;
Enter price: 2.75
Enter quantity: 21
Total price: 57.75