C++ chuỗi: Hướng dẫn thân thiện cho người mới bắt đầu

Xin chào bạn, ngôi sao lập trình tương lai! Là một giáo viên khoa học máy tính với nhiều năm kinh nghiệm, tôi rất vui mừng được带领 bạn vào thế giới kỳ diệu của các chuỗi C++ trong hướng dẫn này. Đừng lo lắng nếu bạn chưa bao giờ viết một dòng mã trước đây - chúng ta sẽ bắt đầu từ rất cơ bản và cùng nhau tiến hóa. Cuối cùng của hướng dẫn này, bạn sẽ có thể làm việc với các chuỗi như những người giỏi nhất! (Xin lỗi, tôi không thể résister một chút戏言 để bắt đầu!)

C++ Strings

Chuỗi kiểu C

Hãy bắt đầu với tổ tiên của tất cả các chuỗi trong C++: chuỗi kiểu C. Các chuỗi này là di sản từ ngôn ngữ lập trình C, nhưng chúng vẫn rất quan trọng để hiểu trong C++.

Chuỗi kiểu C là gì?

Chuỗi kiểu C cơ bản là một mảng các ký tự kết thúc bằng một ký tự đặc biệt gọi là ký tự null (\0). Ký tự null này cho biết vị trí kết thúc của chuỗi.

Dưới đây là một ví dụ đơn giản:

char greeting[] = "Hello";

Trong ví dụ này, greeting thực sự là một mảng 6 ký tự: {'H', 'e', 'l', 'l', 'o', '\0'}.

Làm việc với chuỗi kiểu C

Hãy xem xét một số thao tác phổ biến với chuỗi kiểu C:

  1. Khai báo và khởi tạo:
char name[20] = "Alice";  // Khai báo một chuỗi với tối đa 19 ký tự (cộng với ký tự null)
char city[] = "New York"; // Kích thước được xác định tự động
  1. Nhập và xuất:
#include <iostream>
#include <cstring>

int main() {
char food[50];
std::cout << "Thức ăn yêu thích của bạn là gì? ";
std::cin.getline(food, 50);
std::cout << "Ồ, " << food << "听起来很美味!" << std::endl;
return 0;
}

Trong ví dụ này, chúng ta sử dụng cin.getline() để đọc toàn bộ dòng đầu vào, bao gồm cả khoảng trống.

  1. Thao tác chuỗi:

Chuỗi kiểu C có thể được thao tác bằng các hàm từ thư viện <cstring>. Dưới đây là một số hàm phổ biến:

Hàm Mô tả Ví dụ
strlen() Lấy độ dài chuỗi int len = strlen(name);
strcpy() Sao chép chuỗi từ chuỗi này sang chuỗi khác strcpy(dest, src);
strcat() Concatenate chuỗi strcat(str1, str2);
strcmp() So sánh chuỗi int result = strcmp(str1, str2);

Dưới đây là một chương trình nhỏ sử dụng các hàm này:

#include <iostream>
#include <cstring>

int main() {
char first_name[20] = "John";
char last_name[20] = "Doe";
char full_name[40];

std::cout << "Độ dài của tên đầu tiên: " << strlen(first_name) << std::endl;

strcpy(full_name, first_name);
strcat(full_name, " ");
strcat(full_name, last_name);

std::cout << "Tên đầy đủ: " << full_name << std::endl;

if (strcmp(first_name, last_name) == 0) {
std::cout << "Tên đầu tiên và tên cuối cùng là alike!" << std::endl;
} else {
std::cout << "Tên đầu tiên và tên cuối cùng là khác nhau." << std::endl;
}

return 0;
}

Chương trình này minh họa việc tính toán độ dài chuỗi, sao chép, nối chuỗi và so sánh chuỗi. Rất thú vị, phải không?

Lớp Chuỗi trong C++

Bây giờ, hãy chuyển sang cách xử lý chuỗi hiện đại và tiện lợi hơn trong C++: lớp std::string.

Giới thiệu về std::string

Lớp std::string là một phần của Thư viện Tiêu chuẩn C++ và cung cấp một cách thức thân thiện hơn để làm việc với chuỗi. Nó tự động quản lý bộ nhớ và có nhiều hàm thành viên hữu ích.

Để sử dụng std::string, bạn cần bao gồm đầu文件的 <string>:

#include <string>

Tạo và sử dụng các đối tượng std::string

Hãy xem một số ví dụ:

  1. Khai báo và khởi tạo:
std::string greeting = "Hello, world!";
std::string name("Alice");
std::string empty_string;  // Tạo một chuỗi trống
  1. Nhập và xuất:
#include <iostream>
#include <string>

int main() {
std::string favorite_color;
std::cout << "Màu yêu thích của bạn là gì? ";
std::getline(std::cin, favorite_color);
std::cout << "Ồ, " << favorite_color << " là một màu đẹp!" << std::endl;
return 0;
}

Lưu ý rằng chúng ta sử dụng std::getline() để đọc toàn bộ dòng đầu vào, bao gồm cả khoảng trống.

  1. Thao tác chuỗi:

Lớp std::string cung cấp nhiều hàm thành viên hữu ích. Dưới đây là một số hàm phổ biến:

Hàm Mô tả Ví dụ
length() hoặc size() Lấy độ dài chuỗi int len = str.length();
empty() Kiểm tra xem chuỗi có trống hay không if (str.empty()) { ... }
append() hoặc += Thêm vào chuỗi str.append(" World"); hoặc str += " World";
substr() Lấy substring std::string sub = str.substr(0, 5);
find() Tìm substring size_t pos = str.find("hello");
replace() Thay thế một phần của chuỗi str.replace(0, 5, "Hi");

Hãy sử dụng chúng trong một chương trình:

#include <iostream>
#include <string>

int main() {
std::string sentence = "The quick brown fox jumps over the lazy dog";

std::cout << "Độ dài của câu: " << sentence.length() << std::endl;

if (!sentence.empty()) {
std::cout << "Câu không trống." << std::endl;
}

sentence += "!";  // Thêm một dấu than
std::cout << "Câu đã cập nhật: " << sentence << std::endl;

std::string sub = sentence.substr(4, 5);  // Lấy "quick"
std::cout << "Substring: " << sub << std::endl;

size_t fox_pos = sentence.find("fox");
if (fox_pos != std::string::npos) {
std::cout << "Found 'fox' at position: " << fox_pos << std::endl;
}

sentence.replace(fox_pos, 3, "cat");
std::cout << "After replacement: " << sentence << std::endl;

return 0;
}

Chương trình này minh họa các thao tác chuỗi như lấy độ dài, kiểm tra trống, thêm vào, lấy substring, tìm kiếm và thay thế.

So sánh chuỗi kiểu C và std::string

Mặc dù chuỗi kiểu C vẫn được sử dụng trong một số ngữ cảnh (đặc biệt là khi giao tiếp với mã C), std::string thường được ưa thích trong C++ hiện đại vì nhiều lý do:

  1. Quản lý bộ nhớ tự động
  2. Dễ sử dụng và an toàn hơn
  3. Các thao tác tiện lợi hơn (như nối chuỗi với toán tử +)
  4. Bộ hàm thành viên phong phú

Dưới đây là một so sánh nhanh:

// Chuỗi kiểu C
char cstr1[20] = "Hello";
char cstr2[20];
strcpy(cstr2, cstr1);  // Sao chép
strcat(cstr1, " World");  // Nối

// std::string
std::string str1 = "Hello";
std::string str2 = str1;  // Sao chép
str1 += " World";  // Nối

Như bạn có thể thấy, các thao tác std::string là trực quan và ít lỗi hơn.

Kết luận

Chúc mừng! Bạn đã bước những bước đầu tiên vào thế giới của các chuỗi C++. Chúng ta đã xem xét chuỗi kiểu C, một chút old school nhưng vẫn quan trọng để hiểu, và lớp std::string hiện đại và tiện lợi hơn.

Nhớ rằng, thực hành làm nên完美. Hãy thử viết một số chương trình sử dụng cả hai loại chuỗi để củng cố những gì bạn đã học. Trước khi bạn biết, bạn sẽ manipulates chuỗi như một chuyên gia!

Tiếp tục lập mã, tiếp tục học hỏi, và quan trọng nhất, hãy vui vẻ! Ai biết, có lẽ một ngày nào đó bạn sẽ viết thư viện chuỗi của riêng mình. Đến那时候, chúc bạn lập mã vui vẻ!

Credits: Image by storyset