Chuỗi được sử dụng để lưu trữ văn bản. Một biến chuỗi chứa một tập hợp các ký tự được bao quanh bởi dấu ngoặc kép ":
Ví dụ
string chao = "Chao cac em";
Để sử dụng chuỗi, các em phải khai báo sử dụng thư viện <string>
#include <iostream>
// Khai bao thu vien <string> de su dung chuoi
#include <string>
using namespace std;
int main() {
string chao = "Chao cac em";
cout << chao;
return 0;
}
1/ Nối chuỗi
Toán tử +
có thể được sử dụng giữa các chuỗi để nối chúng lại với nhau và tạo thành một chuỗi mới.
Ví dụ:
string ho = "Nguyen "; // co khoang trang o cuoi chuoi
string ten = "Dieu";
string hoTen = ho + ten;
cout << hoTen; // ket qua: Nguyen Dieu
Trong ví dụ trên, chúng ta đã thêm một khoảng trắng sau ho
để tạo khoảng trắng giữa Nguyen
và Dieu
ở đầu ra. Tuy nhiên, các em cũng có thể thêm một khoảng trắng với dấu ngoặc kép (""
hoặc ''
):
string ho = "Nguyen"; // khong co khoang trang o cuoi chuoi
string ten = "Dieu";
string hoTen = ho + " " + ten; // tuong duong: string hoTen = ho + ' ' + ten;
cout << hoTen; // ket qua: Nguyen Dieu
Một chuỗi trong C++ thực ra là một đối tượng (đừng lo lắng nếu các em chưa hiểu, chúng ta sẽ được học ở những bài sau), chứa các hàm có thể thực hiện các thao tác nhất định trên chuỗi. Ví dụ: các em cũng có thể nối các chuỗi với hàm append():
string ho = "Nguyen ";
string ten = "Dieu";
string hoTen = ho.append(ten);
cout << hoTen; // ket qua: Nguyen Dieu
2/ Số và chuỗi
C++ sử dụng toán tử +
cho cả phép cộng và phép nối:
- Các giá trị số thì thực hiện phép cộng
- Các giá trị chuỗi thì thực hiện phép nối
Phép cộng
int x = 20;
int y = 5;
int z = x + y;
cout << z; // ket qua: 25
Phép nối
string x = "20";
string y = "5";
string z = x + y;
cout << z; // ket qua: 205
Đừng dùng +
cho các giá trị khác kiểu, chương trình sẽ xảy ra lỗi
int x = 20;
string y = "5";
string z = x + y;
cout << z;
Lỗi error: no match for ‘operator+’
Nếu muốn nối chuỗi và số bằng toán tử +
, các em cần chuyển số sang chuỗi với hàm std::to_string
int x = "20";
string y = 5;
string z = x + std::to_string(y);
cout << z;
3/ Chiều dài của chuỗi
Chuỗi là một tập hợp các ký tự, chiều dài của chuỗi là tổng số ký tự có trong chuỗi. Để lấy độ dài của một chuỗi, các em sử dụng hàm length()
:
string bangChuCai = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
cout << "Chieu dai cua chuoi la: " << bangChuCai.length(); // ket qua: 26
Ngoài ra, các em có thể sử dụng hàm size()
, nó là bí danh của hàm length()
string bangChuCai = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
cout << "Chieu dai cua chuoi la: " << bangChuCai.size(); // ket qua: 26
4/ Truy cập các phần tử trong chuỗi
Các em có thể truy cập các ký tự trong một chuỗi bằng cách tham chiếu đến số chỉ mục
của nó bên trong dấu ngoặc vuông []
.
Ký tự đầu tiên trong chuỗi có số chỉ mục = 0, số chỉ mục của ký tự tiếp theo = số chỉ mục của ký tự đứng liền kề ở trước + 1
string myString = "Hello";
cout << myString[0]; // ket qua: H
cout << myString[1]; // ket qua: e
myString | H | e | l | l | o |
Số chỉ mục | 0 | 1 | 2 | 3 | 4 |
Gợi ý: Làm sao để tính được số chỉ mục của ký tự cuối cùng trong một chuỗi bất kỳ!
5/ Xử lý chuỗi người dùng nhập vào
Trong bài "Người dùng nhập vào trong C++" trước, các em đã được học cin >>
để lấy dữ liệu người dùng nhập vào từ bàn phím. Tuy nhiên, có một vấn đề nhỏ, cin >>
sẽ bỏ qua một số ký tự như khoảng trắng
(whitespace), tab khi người dùng nhập vào.
Ví dụ:
string hoTen;
cout << "Nhap vao ho ten: ";
cin >> hoTen; // nhap: Nguyen Dieu
cout << hoTen; // ket qua chi la: Nguyen
Như vậy cin >>
chỉ lấy được 1 từ đầu tiên. Đó là lý do tại sao khi làm việc với chuỗi, chúng ta thường sử dụng thêm hàm getline()
để đọc một dòng văn bản.
Cú pháp: getline(cin, tên_biến)
Ví dụ:
string hoTen;
cout << "Nhap vao ho ten: ";
getline(cin, hoTen); // nhap: Nguyen Dieu
cout << hoTen; // ket qua chi la: Nguyen Dieu
6/ Thay thế chuỗi
Sử dụng hàm replace
khi các em cần thay thế một phần của chuỗi đang có bằng một nội dung mới.
Cú pháp: str.replace(pos, len, sub_str)
str
: chuỗi đang cópos
: vị trí (số chỉ mục) của ký tự bắt đầu được thay thế trongstr
len
: số ký tự cần thay thế tính từpos
sub_str
: nội dung mới
Ví dụ:
#include <iostream>
#include <string>
using namespace std;
int main() {
string str = "Chao cac em";
string sub_str = "Tam biet";
str.replace(0, 4, sub_str);
cout << str; // ket qua: Tam biet cac em
return 0;
}
Gợi ý: các em có thể thay thế 1 ký tự tại vị trí bất kỳ trong chuỗi với cú pháp str[pos] = ký_tự_mới;
7/ Tìm chuỗi trong chuỗi
Cú pháp: t_size str.find(str1, pos)
t_size
: kiểu dữ liệu của kết quả tìmstr
: chuỗi chứa chuỗi cần tìmpos
: vị trí (số chỉ mục) bắt đầu tìm trongstr
(mặc định là 0)str1
: chuỗi cần tìm bắt đầu từ vị trịpos
trong chuỗistr
- Nếu không tìm thấy str1 trong str thì sẽ trả về string::npos, tìm thấy thì sẽ trả về vị trí đầu tiền str1 xuất hiện
Ví dụ
int main() {
string str = "meo meo gau gau";
string str1 = "gau";
size_t timthay = str.find(str1);
if (string::npos == timthay) {
cout << "Khong tim thay '" << str1 << "'";
}
else {
cout << timthay;
}
}
Kết quả: 8
8/ Không gian tên
Các em có thể thấy một số chương trình C++ chạy mà không có thư viện không gian tên tiêu chuẩn. Dòng using namespace std
có thể được bỏ qua và thay thế bằng từ khóa std
, theo sau là toán tử ::
cho các đối tượng chuỗi (và cout
):
Ví dụ bỏ qua using namespace std
#include <iostream>
#include <string>
int main() {
std::string chao = "Chao cac em";
std::cout << chao;
return 0;
}
Ví dụ sử dụng using namespace std
#include <iostream>
#include <string>
using namespace std;
int main() {
string chao = "Chao cac em";
cout << chao;
return 0;
}