thao-tac-voi-chuoi-trong-cpp.png (16 KB)

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 NguyenDieu ở đầ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ế trong str
  • 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ìm
  • str: chuỗi chứa chuỗi cần tìm
  • pos: vị trí (số chỉ mục) bắt đầu tìm trong str (mặc định là 0)
  • str1: chuỗi cần tìm bắt đầu từ vị trị pos trong chuỗi str
  • 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;
}