Phần trước: [C++ Cơ bản] Phần 15: Các giá trị kiểu số. Thư viện toán học cmath.
Biểu diễn giá trị kiểu char
Các giá trị kiểu char
sẽ được đặt trong dấu ngoặc đơn ''
. Nếu như giá trị kiểu char có tiền tố L
, giá trị đó thuộc kiểu wchar_t
. Nếu không có thì giá trị mặc định thuộc kiểu char
.
Bên trong ngoặc đơn có thể là kí tự được biểu diễn (ví dụ 'x'
), một kí tự đặc biệt (ví dụ '\n'
), hoặc một kí tự thuộc chuẩn UCS (mà bạn tạm thời chưa cần phải quan tâm vội).
Kí tự đặc biệt
Muốn thể hiện kí tự thường thì sử dụng ''
. Vậy nếu muốn thể hiện kí tự ngoặc đơn '
thì làm như thế nào?
Để thể hiện một số kí tự đặc biệt, ta sử dụng escape sequence - dịch thô ra là “dãy kí tự thoát”, nhưng ở đây sẽ sử dụng cách gọi gốc. Escape sequence bắt đầu bằng kí tự \
, tiếp theo là một hoặc nhiều kí tự khác. Các escape sequence mang ý nghĩa đặc biệt.
Ví dụ cho một số escape sequence:
Escape sequence | Ý nghĩa |
---|---|
\\ |
Kí tự \ |
\' |
Kí tự ngoặc đơn ' |
\" |
Kí tự ngoặc kép " |
\? |
Dấu hỏi ? |
\n |
Kí tự xuống dòng |
\b |
Backspace (Kí tự xóa) |
endl
và '\n'
“Khoan khoan khoan, sao lại có thêm một kí tự xuống dòng ở kia?”
Tuy cùng có khả năng xuống dòng cho output, tuy nhiên endl
và '\n'
lại có chức năng khác nhau.
endl
khi được đẩy vào output sẽ output ra kí tự xuống dòng ('\n'
) và giải phóng buffer (flush).
'\n'
thì chỉ là kí tự xuống dòng.
Trong lập trình thi đấu, việc flush buffer nhiều cũng sẽ làm giảm tốc độ của chương trình đi. Vậy nên đối với các bạn tham gia lập trình thi đấu, mình khuyến cáo sử dụng '\n'
thay cho endl
.
Ví dụ:
Output
10
20
String
String hay còn gọi là xâu kí tự, chuỗi kí tự, vân vân… là một tập hợp kí tự. Chúng hình thành nên câu, từ, đoạn văn, vân vân…
Để biểu diễn một string, ta đặt một chuỗi kí tự trong ngoặc kép ""
. Dòng chữ "Hello world!"
mặc định của chương trình CodeBlocks cũng là một string.
C++ hỗ trợ hai phương pháp biểu diễn dữ liệu string - phương pháp biểu diễn bằng mảng char
của C, và class string
mới trong C++.
Phương pháp mảng char
Ngôn ngữ C sử dụng mảng các giá trị kiểu char
để biểu diễn một string. Mảng này bao gồm các kí tự của string, cộng thêm với một kí tự kết thúc null '\0'
.
Ví dụ: Ta có thể khai báo string hello
như sau
Việc khai báo này cũng tương đương với đoạn code sau:
Ta có thể in ra string hello
bằng các lệnh in dữ liệu thông thường.
C++ cung cấp thư viện cstring
để thực hiện các thao tác phức tạp hơn với kiểu dữ liệu string được biểu diễn bằng mảng char
. Một số hàm quan trọng của thư viện này là:
Hàm | Chức năng |
---|---|
strcpy(s1, s2) |
Gán giá trị của string s2 cho s1 |
strcat(s1, s2) |
Gắn string s2 vào cuối s1 |
strlen(s1) |
Trả về độ dài của string s1 |
strcmp(s1, s2) |
Trả về 0 nếu string s1 bằng s2 . Trả về một giá trị số nguyên bé hơn 0 nếu s1 nhỏ hơn s2 , và lớn hơn 0 nếu s1 lớn hơn s2 . |
strchr(s1, ch) |
Trả lại con trỏ bộ nhớ của vị trí đầu tiên trong string s1 có sự xuất hiện của kí tự ch |
strstr(s1, s2) |
Trả lại con trỏ bộ nhớ của vị trí đầu tiên trong string s1 có sự xuất hiện của string s2 |
Chú ý: Một string s1
được gọi là bé hơn string s2
, nếu như kí tự đầu tiên khác nhau giữa hai string từ trái qua ở string s1
có giá trị nhỏ hơn ở string s2
- hiểu nôm na thì s1
có thứ tự trong từ điển đứng trước s2
.
Ví dụ:
- String
"abcabc"
có thứ tự từ điển đứng trước"acb"
- String
"abc"
có thứ tự từ điển đứng trước"abcabc"
Chi tiết đầy đủ về các hàm của thư viện này có thể được tìm thấy ở đây.
Class string
C++ cũng cung cấp class/kiểu dữ liệu string
để quản lý xâu kí tự. Để sử dụng class này, ta cần phải khai báo thư viện string
.
Ưu điểm của class string
là khả năng sử dụng các toán tử - ta có thể sử dụng toán tử +
để ghép hai string lại với nhau, hay sử dụng các toán tử so sánh để so sánh các đối tượng string với nhau, thay vì phải sử dụng hàm như phương pháp mảng char
.
string
ngang hàng với kiểu dữ liệu xâu kí tự mảng char
về nhiều mặt - giá trị của hai kiểu dữ liệu có thể được gán cho nhau, và chúng có thể được đặt chung trong một phép toán. Chú ý rằng mảng char
không thể được áp dụng các toán tử với nhau như string
, mà phải có giá trị kiểu string trong phép toán.
Ví dụ: Chương trình sau đây yêu cầu bạn nhập tên của mình vào, và in ra một câu chào hỏi.
Để truy cập vào kí tự của một đối tượng class string
, ta cũng sử dụng ngoặc vuông như đối với mảng char
. Ví dụ ViDu[3]
là kí tự thứ 4 của string ViDu
.
Thư viện cstring
không thể áp dụng lên các đối tượng class string
, thay vào đó bản thân đối tượng string
có những hàm để hỗ trợ cho chính bản thân mình.
Lấy ví dụ với biến string s = "Hello"
, một số hàm quan trọng của string
bao gồm:
Hàm | Chức năng | Ví dụ |
---|---|---|
đối_tượng.size() và đối_tượng.length() |
Trả về độ dài của đối tượng | s.size() trả về 5 |
đối_tượng.clear() |
Xóa hết nội dung của string | |
đối_tượng.empty() |
Kiểm tra xem string có phải là string rỗng không (string độ dài bằng 0) | s.empty() trả về false |
đối_tượng.substr(int, int) |
Trả về string con của string đối tượng. Tham số đầu tiên là chỉ số bắt đầu của string con cần lấy, tham số thứ hai là độ dài cần lấy. | s.substr(1, 3) trả về "ell" |
Các bạn có thể tham khảo danh sách đẩy đủ các hàm của class string
trên trang C++ Reference.
Chú ý: Kiến thức về class, object và lập trình hướng đối tượng sẽ được giải thích rõ ràng trong các bài viết sau.
Phần sau: [C++ Cơ bản] Phần 17: Tham chiếu và con trỏ. Tác dụng của con trỏ.