Thứ Bảy, 10 tháng 3, 2012

Bài 10.1 ./ ÔN LẠI XÂU KÍ TỰ VÀ HẰNG KÝ TỰ .


1. Hằng kí tự 
a. Cách viết hằng 
Có 2 cách để viết một hằng kí tự. Đối với các kí tự có mặt chữ thể hiện ta thường 
sử dụng cách viết thông dụng đó là đặt mặt chữ đó giữa 2 dấu nháy đơn như: 'A', '3', ' ' 
dấu cách) ... hoặc sử dụng trực tiếp giá trị số của chúng. Ví dụ các giá trị tương ứng 
của các kí tự trên là 65, 51 và 32. Với một số kí tự không có mặt chữ ta buộc phải dùng 
giá trị (số) của chúng, như viết 27 thay cho kí tự được nhấn bởi phím Escape, 13 thay 
cho kí tự được nhấn bởi phím Enter ...  
Để biểu diễn kí tự bằng giá trị số ta có thể viết trực tiếp (không dùng cặp dấu 
háy đơn) giá trị đó dưới dạng hệ số 10 (như trên) hoặc đặt chúng vào cặp dấu nháy 
đơn, trường hợp này chỉ dùng cho giá trị viết dưới dạng hệ 8 hoặc hệ 16 theo mẫu sau:  
−  '\kkk': không quá 3 chữ số trong hệ 8. Ví dụ '\11' biểu diễn kí tự có mã 9. 
−  '\xkk': không quá 2 chữ số trong hệ 16. Ví dụ '\x1B' biểu diễn kí tự có mã 27.  
---------------------------------------------------------------------------------

Tóm lại, một kí tự có thể có nhiều cách viết, chẳng hạn 'A' có giá trị là 65 (hệ 10) 
hoặc 101 (hệ 8) hoặc 41 (hệ 16), do đó kí tự 'A' có thể viết bởi một trong các dạng sau: 
   65, 0101, 0x41 hoặc 'A' , '\101' , '\x41' 
Tương tự, dấu kết thúc xâu có giá trị 0 nên có thể viết bởi 0 hoặc '\0' hoặc '\x0', 
trong các cách này cách viết '\0' được dùng thông dụng nhất. 
  

b. Một số hằng thông dụng 
Đối với một số hằng kí tự thường dùng nhưng không có mặt chữ tương ứng, hoặc 
các kí tự được dành riêng với nhiệm vụ khác, khi đó thay vì phải nhớ giá trị của chúng 
ta có thể viết theo qui ước sau: 
'\n' : biểu thị kí tự xuống dòng (cũng tương đương với endl) 
'\t' : kí tự tab 
'\a' : kí tự chuông (tức thay vì in kí tự, loa sẽ phát ra một tiếng 'bíp') 
'\r' : xuống dòng 
'\f' : kéo trang 
'\\' : dấu \ 
'\?' : dấu chấm hỏi ? 
'\'' : dấu nháy đơn ' 



'\"' : dấu nháy kép " 
'\kkk' :  kí tự có mã là kkk trong hệ 8 
'\xkk' :  kí tự có mã là kk trong hệ 16 
Ví dụ:  
cout << "Hôm nay trời \t nắng \a \a \a \n" ; 
sẽ in ra màn hình dòng chữ "Hôm nay trời" sau đó bỏ một khoảng cách bằng một 
tab (khoảng 8 dấu cách) rồi in tiếp chữ "nắng", tiếp theo phát ra 3 tiếng chuông và cuối 
cùng con trỏ trên màn hình sẽ nhảy xuống đầu dòng mới.  
Do dấu cách (phím spacebar) không có mặt chữ, nên trong một số trường hợp để 
tránh nhầm lẫn chúng tôi qui ước sử dụng kí hiệu <>  để biểu diễn dấu cách. Ví dụ 
trong giáo trình này dấu cách (có giá trị là 32) được viết ' ' (dấu nháy đơn bao một dấu 
cách) hoặc rõ ràng hơn bằng cách viết theo qui ước <>. 



2. Hằng xâu kí tự 
Là dãy kí tự bất kỳ đặt giữa cặp dấu nháy kép. Ví dụ: "Lớp K43*", "12A4", "A", 


"<>", "" là các hằng xâu kí tự, trong đó "" là xâu không chứa kí tự nào, các xâu "<>", 


"A" chứa 1 kí tự ... Số các kí tự giữa 2 dấu nháy kép được gọi là độ dài của xâu. Ví dụ 
xâu "" có độ dài 0, xâu "<>" hoặc "A" có độ dài 1 còn xâu "Lớp K43*" có độ dài 8. 


Chú ý phân biệt giữa 2 cách viết 'A' và "A", tuy chúng cùng biểu diễn chữ cái A 
nhưng chương trình sẽ hiểu 'A' là một kí tự còn "A" là một xâu kí tự (do vậy chúng 
được bố trí khác nhau trong bộ nhớ cũng như cách sử dụng chúng là khác nhau). 
Tương tự ta không được viết '' (2 dấu nháy đơn liền nhau) vì không có khái niệm kí tự 



"rỗng". Để chỉ xâu rỗng (không có kí tự nào) ta phải viết "" (2 dấu nháy kép liền nhau). 
Tóm lại một giá trị có thể được viết dưới nhiều kiểu dữ liệu khác nhau và do đó 
cách sử dụng chúng cũng khác nhau. Ví dụ liên quan đến khái niệm 3 đơn vị có thể có 
các cách viết sau tuy nhiên chúng hoàn toàn khác nhau: 
−  3  : số nguyên 3 đơn vị 
−  3L : số nguyên dài 3 đơn vị 
−  3.0 : số thực 3 đơn vị  
−  '3' : chữ số 3 
−  "3" : xâu chứa kí tự duy nhất là 3  



3. Xâu kí tự 
Một xâu kí tự là một dãy bất kỳ các kí tự (kể cả dấu cách) do vậy nó có thể được 
lưu bằng mảng kí tự. Tuy nhiên để máy có thể nhận biết được mảng kí tự này là một 
xâu, cần thiết phải có kí tự kết thúc xâu, theo qui ước là kí tự có mã 0 (tức '\0') tại vị trí 
nào đó trong mảng. Khi đó xâu là dãy kí tự bắt đầu từ phần tử đầu tiên (thứ 0) đến kí tự 
kết thúc xâu đầu tiên (không kể các kí tự còn lại trong mảng). 
  
0  1  2  3  4  5  6  7 
H  E  L  L  O  \0     
H  E  L  \0  L  O  \0   
\0  H  E  L  L  O  \0   


Hình vẽ trên minh hoạ 3 xâu, mỗi xâu được chứa trong mảng kí tự có độ dài tối 
đa là 8. Nội dung xâu thứ nhất là "Hello" có độ dài thực tế là 5 kí tự, chiếm 6 ô trong 
mảng (thêm ô chứa kí tự kết thúc '\0'). Xâu thứ hai có nội dung "Hel" với độ dài 3 
(chiếm 4 ô) và xâu cuối cùng biểu thị một xâu rỗng (chiếm 1 ô). Chú ý mảng kí tự 
được khai báo với độ dài 8 tuy nhiên các xâu có thể chỉ chiếm một số kí tự nào đó 
trong mảng này và tối đa là 7 kí tự. 



a. Khai báo  


char <tên xâu>[độ dài] ;      // không khởi tạo 
char <tên xâu>[độ dài] = xâu kí tự ;   // có khởi tạo 
char <tên xâu>[] = xâu kí tự ;    // có khởi tạo 


−  Độ dài mảng là số kí tự tối đa có thể có trong xâu. Độ dài thực sự của xâu chỉ 
tính từ đầu mảng đến dấu kết thúc xâu (không kể dấu kết thúc xâu ‘\0’).  
−  Do một xâu phải có dấu kết thúc xâu nên trong khai báo độ dài của mảng cần 
phải khai báo thừa ra một phần tử. Thực chất độ dài tối đa của xâu = độ dài 
mảng - 1. Ví dụ nếu muốn khai báo mảng s chứa được xâu có độ dài tối đa 80 
kí tự, ta cần phải khai báo char s[81]. 
−  Cách khai báo thứ hai có kèm theo khởi tạo xâu, đó là dãy kí tự đặt giữa cặp 
dấu nháy kép. Ví dụ:  
char hoten[26] ;     // xâu họ tên chứa tối đa 25 kí tự 



char monhoc[31] = "NNLT C++" ;     
xâu môn học chứa tối đa 30 kí tự, được khởi tạo với nội dung "NNLT C++" với 
độ dài thực sự là 10 kí tự (chiếm 11 ô đầu tiên trong mảng monhoc[31]). 
−  Cách khai báo thứ 3 tự chương trình sẽ quyết định độ dài của mảng bởi xâu 
khởi tạo (bằng độ dài xâu + 1). Ví dụ: 
char thang[] = "Mười hai" ;   // độ dài mảng = 9 
b. Cách sử dụng 
Tương tự như các mảng dữ liệu khác, xâu kí tự có những đặc trưng như mảng, tuy 
nhiên chúng cũng có những điểm khác biệt. Dưới đây là các điểm giống và khác nhau 
đó. 



•  Truy cập một kí tự trong xâu: cú pháp giống như mảng. Ví dụ: 
char s[50] = "I\'m a student" ; // chú ý kí tự ' phải được viết là \' 
cout << s[0] ;    // in kí tự đầu tiên, tức kí tự 'I' 
s[1] = 'a' ;     // đặt lại kí tự thứ 2 là 'a' 
   
•  Không được thực hiện các phép toán trực tiếp trên xâu như: 
char s[20] = "Hello", t[20] ;  // khai báo hai xâu s và t 
t = "Hello" ;     // sai, chỉ gán được khi khai báo 
t = s ;      // sai, không gán được toàn bộ mảng 
if (s < t) …     // sai, không so sánh được hai mảng 
… 



•  Toán tử nhập dữ liệu >> vẫn dùng được nhưng có nhiều hạn chế. Ví dụ  
char s[60] ; 
cin >> s ; 
cout << s ; 
nếu xâu nhập vào là "Tin học hoá" chẳng hạn thì toán tử >> chỉ nhập "Tin" cho s 
(bỏ tất cả các kí tự đứng sau dấu trắng), vì vậy khi in ra trên màn hình chỉ có từ "Tin". 
Vì các phép toán không dùng được trực tiếp trên xâu nên các chương trình dịch 
đã viết sẵn các hàm thư viện được khai báo trong file nguyên mẫu string.h. Các hàm 
này giải quyết được hầu hết các công việc cần thao tác trên xâu. Nó cung cấp cho NSD 
phương tiện để thao tác trên xâu như gán, so sánh, sao chép, tính độ dài xâu, nhập, in, 
… Để sử dụng được các hàm này đầu chương trình cần có khai báo string.h. Phần lớn 
các hàm này sẽ được giới thiệu trong phần tiếp sau. 











Không có nhận xét nào:

Đăng nhận xét