CHƯƠNG 7CHƯƠNG 7
CHUỔI KÝ TỰCHUỔI KÝ TỰ
(String)(String)
(String)(String)
1. Giớithiệu1. Giớithiệu
1.
Giới
thiệu1.
Giới
thiệu
y Chuổilàm
ộ
tmản
g
k
ý
t
ự
đư
ợ
ckết thúc
ộ
g
ý
ự
ợ
bằng ký tự null (‘\0’).
y
Ký
tự
null
(
‘
\
0
’
)
là
ký
tự
dùng
để
kết
Ký
tự
null
(
\
0
)
là
ký
tự
dùng
để
kết
thúc chuổi
y
Hằng
chuổi
là
chuổi
được
bao
quanh
bởi
y
Hằng
chuổi
là
chuổi
được
bao
quanh
bởi
cặpdấu nháy đôi. Ví dụ: "Hello"
2.2.
KhaiKhai
báobáo
vàvà
khởikhởi
tạotạo
chuổichuổi
2.
2.
KhaiKhai
báobáo
vàvà
khởikhởi
tạotạo
chuổichuổi
Có 2 cách khai báo và khởit
ạ
ochuổi
ạ
y Cách 1: Dùng mảng mộtchiều
h
Tê
biế
[
Chiề
dài
tối
đ
]
Ví
d
h
t
[12]
c
h
ar <
Tê
n
biế
n>
[
Chiề
u
dài
tối
đ
a
]
y
Ví
dụ
: c
h
ar s
t
r
[12]
;
Trong khai báo này, bộ nhớ sẽ cung
ấ
ể
ữ
ộ
c
ấ
p12+1bytesđ
ể
lưutr
ữ
n
ộ
idun
g
củachuỗikýtự str; byte cuối cùng lưu
ữ
ký
‘
\
’
để
kế
hú
h ỗ
tr
ữ
ký
tự
‘
\
0
’
để
kế
tt
hú
cc
h
u
ỗ
i.
2. 2. KhaiKhai báobáo
v
à
v
àkhởikhởit
ạ
ot
ạ
ochuổichuổi
ạạ
Cách 2: Dùn
g
con trỏ
g
char *<Tên biến>
y
Ví dụ:
char *str;
T
kh i
bá
à
bộ
hớ
ẽ
dà h
2
T
ron
g
kh
a
i
bá
on
ày
,
bộ
n
hớ
s
ẽ
dà
n
h
2
byte để lưutrữđịachỉ củabiếncontrỏ
t
đ
hỉ
đế
hư
ấ
ơi
để
s
t
r
đ
an
g
c
hỉ
đế
n, c
hư
acun
g
c
ấ
pn
ơi
để
lưutrữ dữ liệu.
2.2.
KhaiKhai
báobáo
vàvà
khởikhởi
tạotạo
chuổichuổi
2.
2.
KhaiKhai
báobáo
vàvà
khởikhởi
tạotạo
chuổichuổi
y Chuổik
ý
t
ự
g
iốn
g
như mản
g
do đó đ
ể
ý
ự
g g
g
khởitạomộtchuổikýtự vớinhững giá
tr
ị
xác đ
ị
nh ta có th
ể
th
ự
chi
ệ
ntươn
g
t
ự
ị
ị
ự
ệ
g
ự
như vớimảng.
char <Biến>[ ]=<”Hằng chuổi”>
2.2.
KhaiKhai
báobáo
vàvà
khởikhởi
tạotạo
chuổichuổi
2.
2.
KhaiKhai
báobáo
vàvà
khởikhởi
tạotạo
chuổichuổi
y
V
íd
ụ
:
ụ
char str[] = {‘H’, ’e’, ’l’, ’l’, ’o’, ’\0’};
char
str
[] =
“
Hello
”
;
char
str
[]
=
Hello ;
char *str = “Hello”;
3.3.
NhậpNhập
chuổichuổi
3.
3.
NhậpNhập
chuổichuổi
y Đ
ể
nh
ập
dữ li
ệ
uchobiếnchuổi
,
ta dùn
g
ập
ệ
,
g
hàm gets() củathư việnstdio.h.
h * t(h *)h * t(h *)
y
Hàm
gets()
đọc
các
ký
tự
từ
bàn
phím
c
h
ar
*
ge
t
s
(
c
h
ar
*
s
)
;c
h
ar
*
ge
t
s
(
c
h
ar
*
s
)
;
y
Hàm
gets()
đọc
các
ký
tự
từ
bàn
phím
vào trong mảng trỏđếnbởischođến
khi
nhấn
Enter
Ký
tự
null
sẽ
được
đặt
khi
nhấn
Enter
.
Ký
tự
null
sẽ
được
đặt
sau ký tự cuối cùng củachuổinhậpvào
trong
mảng
trong
mảng
.
y Hoặctacóthể dùng cin >> s;
4.4.
XuấtXuất
chuổichuổi
4.
4.
XuấtXuất
chuổichuổi
y Đ
ể
xuấtchuổiramànhình
,
ta dùn
g
hàm
,
g
puts() củathư việnstdio.h.
int
puts(const char *
s
);
y
Hoặc
ta
có
thể
dùng
cout
int
puts(const
char
*
s
);
y
Hoặc
ta
có
thể
dùng
cout
y cout << s;
VíVí
dụdụ
::
VíVí
dụdụ
::
#include <iostream.h>
#include <stdio.h>
int main()
{
{
char str[20];
cout
<<"
nhap
chuoi
:";
cout
<<"
nhap
chuoi
:";
gets(str);
cout
<<
"
\
nXuat
chuoi
:
"
;
cout
<<
\
nXuat
chuoi
:;
puts(str);
return 0;
return
0;
}
5.5.
CácCác
hàmhàm
thaothao
táctác
trêntrên
chuổichuổi
5.
5.
CácCác
hàmhàm
thaothao
táctác
trêntrên
chuổichuổi
y strcpy(s1, s2): Sao chép chuổis2 vàos1
í
d
V
í
d
ụ:
#include <iostream.h>
#include <
stdio h
>
#include <
stdio
.
h
>
#include <string.h>
void main
()
()
{
char str1[20], str2[20];
t
"
h
hi
1" t(t1)
cou
t
<<
"
n
h
ap c
h
uo
i
1
:
"
;
ge
t
s
(
s
t
r
1)
;
strcpy(str2,str1);
cout
<<
"
\
nXuat
chuoi
2:
"
; puts(str2);
cout
<<
\
nXuat
chuoi
2: ; puts(str2);
}
5.5.
CácCác
hàmhàm
thaothao
táctác
trêntrên
chuổichuổi
5.
5.
CácCác
hàmhàm
thaothao
táctác
trêntrên
chuổichuổi
y strcat(s1, s2): Nốichuổis2 vàocuốichuổis1
Ví
d
:
Ví
d
ụ
:
#include <iostream.h>
#include <stdio.h>
#include <string.h>
void main()
{
{
char str1[20], str2[20];
cout<<"nhap chuoi 1:"; gets(str1);
cout
<<"
\
nhap
chuoi
2:"; gets(str2);
cout
<<"
\
nhap
chuoi
2:"; gets(str2);
strcat(str1,str2);
cout<<"\nXuat chuoi sau khi noi:";
puts(str1);
}
5.5.
CácCác
hàmhàm
thaothao
táctác
trêntrên
chuổichuổi
5.
5.
CácCác
hàmhàm
thaothao
táctác
trêntrên
chuổichuổi
y strchr(s1, ch) : Trả về con trỏ đếnvị trí
ấ
t
hi
ệ
n
đ
ầ
tiên
c
ủ
a
ký
t
ch
tong
ch
ổ
i
s
1
xu
ấ
t
hi
ệ
n
đ
ầ
u
tiên
c
ủ
a
ký
t
ự
ch
t
r
ong
ch
u
ổ
i
s
1
Ví dụ:
void main()
void main()
{
char *p, h, str1[20];
cou
t
<<"nhap chuoi 1:”;
g
ets(str1);
cout<<"Nhap ktu muon tim:"; cin>>h;
p=
strchr
(str1 h);
p=
strchr
(str1
,
h);
if(p==NULL) cout<<"Khong tim thay ";
else cout<<"Tim thay tai vi tri "<<(p-str1);
}
5.5.
CácCác
hàmhàm
thaothao
táctác
trêntrên
chuổichuổi
5.
5.
CácCác
hàmhàm
thaothao
táctác
trêntrên
chuổichuổi
y strstr(s1, s2): Trả về con trỏ đếnvị trí xuấthiện
ầ
ổ
đ
ầ
utiêncủachu
ổ
is2tron
g
s1.
Ví dụ:voidmain()
{
h
*
[
]
[
]
{
c
h
ar
*
p, str1
[
20
]
,str2
[
20
]
;
cout<<"nhap chuoi 1:"; gets(str1);
cout
<<
"
nhap
chuoi
2
:
"
;
gets(str
2
)
;
cout
<<
nhap
chuoi
2
:
;
gets(str
2
)
;
p= strstr(str1,str2);
if(p
==
NULL)
if(p NULL)
cout<<"Khong tim thay ";
else
cout<<"Tim thay tai vi tri "<<(p-str1);
}
6.6.
MảngMảng
cáccác
chuổichuổi
6.
6.
MảngMảng
cáccác
chuổichuổi
y Mản
g
các chuổilàm
ộ
tmản
g
k
ý
t
ự
hai
g
ộ
g
ý
ự
chiều. Kích thướccủachỉ mụcthứ nhất
là s
ố
chuổivàkíchthướccủachỉ m
ụ
c
ụ
thứ hai xác định chiềudàilớnnhấtcủa
mỗichuổi.
Ví dụ: char str[5][80];
Khai
báo
một
mảng
của
5
chuổi
mỗi
Khai
báo
một
mảng
của
5
chuổi
,
mỗi
chuổicóchiềudàitối đalà79kýtự.
6.6.
MảngMảng
cáccác
chuổichuổi
6.
6.
MảngMảng
cáccác
chuổichuổi
y Khai báo
v
àkhởi
t
ạ
omản
g
các chuổi
ạ
g
char arrayList[][length] = {
constantString1,
constantString2,
constantStringN};
y Ví d
ụ
:
ụ
char listOfPL[][10] = {“Pascal”, “C++”, “C#”};
6.6.
MảngMảng
cáccác
chuổichuổi
6.
6.
MảngMảng
cáccác
chuổichuổi
Ví dụ:
void main()
{
h li t[5][20]
c
h
ar
li
s
t[5][20]
;
for(int i=0; i<5; i++)
{
{
cout<<"name"<<i<<":“; cin>>list[i];
}
}
for(int j=0; j<5; j++)
cout
<<
""
<<list[j];
cout
<<
<<list[j];
}
7.7.
MảngMảng
concon
trỏtrỏ
đếnđến
cáccác
chuổichuổi
7.
7.
MảngMảng
con
con
trỏtrỏ
đếnđến
cáccác
chuổichuổi
y Ngoài cách dùng mảng ký tự hai chiều để lưu
ổ
ể
tr
ữ
mản
g
các chu
ổ
i, ta có th
ể
dùn
g
mản
g
của
các con trỏ.Mỗicontrỏ sẽ chứa địachỉ của
chuổi
chuổi
y Ví dụ:
h
*
t
[
20
]
c
h
ar
*
s
t
r
[
20
]
;
void main()
{
{
char *name[5];
for(int i=0 ; i<5 ; i++)
name[i] = (char *)malloc(20);
for(int i=0 ; i<5 ; i++)
{
{
cout << "Input name " << i+1 <<": ";
gets(name[
i
]);
gets(name[
i
]);
}
c
ou
t << "List
o
f n
a
mes: "
;
ou
oa ;
for(int i=0 ; i<5 ; i++)
cout << name[i] << ", ";
}