Đôi khi có nhu cầu quản lý khối lượng lớn dữ liệu văn bản trong các lĩnh vực như ngôn ngữ học tính toán, học máy, và phân tích dữ liệu. Vì vậy, trong C++, string (chuỗi) và list (danh sách) thường được dùng cho việc này. Có lẽ, chúng ta cần xóa các lần xuất hiện đầu tiên của một ký tự từ chuỗi hoặc danh sách ký tự. Trong bài viết này, chúng ta sẽ xem các phương pháp thay thế để xóa ký tự đầu tiên của chuỗi trong C++. Hàm này xóa ký tự đầu tiên của nội dung chuỗi, kết quả là chuỗi ngắn hơn.
Ví Dụ 1: Xóa Ký Tự Đầu Tiên Của Chuỗi Dùng Phương Thức erase() Trong C++
Hàm string::erase là phương pháp được khuyên dùng để xóa ký tự từ chuỗi tại chỗ (in place). Nạp chồng phạm vi (Scope overload) được minh họa trong chương trình C++ sau:
Hãy bắt đầu với hàm main của chương trình. Bên trong ngoặc hàm main, đã định nghĩa mẫu lớp chuẩn (standard class template) để biểu diễn biến chuỗi là “StrValue”. Biến chuỗi “StrValue” được khởi tạo với chuỗi từ. Có câu lệnh cout chuẩn in chuỗi như khởi tạo. Sau đó, thực hiện phương thức erase trên chuỗi này, “StrValue”.
Bên trong phương thức erase, truyền 0 và 1 làm đối số. Giá trị “0” là chỉ số (index) của ký tự đầu tiên trong chuỗi “StrValue”, và giá trị “1” là ký tự đầu tiên đặt trong chuỗi. Sau vị trí chỉ định, phương thức erase sẽ xóa độ dài ký tự được cung cấp từ chuỗi. Cuối cùng, có câu lệnh in chuỗi sau khi xóa ký tự đầu tiên.
#include <iostream>
#include <string>
int main()
{
std::string StrValue = "Happy Me";
std::cout << "String Before:" << StrValue << std::endl;
StrValue.erase(0, 1);
std::cout << "String After:" << StrValue << std::endl;
return 0;
}
Đầu ra sau cho thấy hoạt động của phương thức erase trên chuỗi chỉ định. Như bạn thấy, ký tự đầu tiên của chuỗi đã bị xóa:

Ví Dụ 2: Xóa Ký Tự Đầu Tiên Của Chuỗi Dùng Phương Thức Iterator Trong C++
Một phương án nạp chồng khác của erase() xóa iterator. Nó chấp nhận iterator làm tham số và xóa ký tự được chỉ định bởi nó. Bằng cách truyền iterator trỏ đến ký tự đầu tiên của chuỗi, ta có thể xóa ký tự đầu tiên của chuỗi.
Chúng ta dùng phương thức erase trong hàm main của chương trình sau. Định dạng chuẩn của chuỗi được định nghĩa trong hàm main. Biến chuỗi tạo là “StringIs” và khởi tạo với chuỗi ký tự. Trước hết, in chuỗi trước khi áp dụng phương thức erase iterator.
Sau đó, gọi phương thức erase của chuỗi trước. Phương thức erase có iterator begin cho chuỗi “StrValue” dùng để trả về iterator trỏ đến ký tự đầu tiên của chuỗi. Khi ký tự đầu tiên được trả về, phương thức erase sẽ xóa ký tự khỏi chuỗi. Sau đó, chuỗi sẽ được in, đã xóa ký tự đầu tiên.
#include <iostream>
#include <string>
int main()
{
std::string StringIs = "Programming Example";
std::cout << "String Before: " << StringIs << std::endl;
StringIs.erase(StringIs.begin());
std::cout << "String After: " << StringIs << std::endl;
return 0;
}
Shell hiển thị đầu ra, cho thấy chuỗi trước phương thức erase iterator và sau khi ký tự đầu tiên bị xóa khỏi chuỗi.

Ví Dụ 3: Kiểm Tra Chuỗi Rỗng Để Xóa Ký Tự Đầu Tiên Từ Chuỗi Trong C++
Trước khi dùng hàm string::erase, hãy đảm bảo không có chuỗi rỗng. Nếu chuỗi đầu vào rỗng, chương trình ném ngoại lệ std::length_error.
Chương trình bao gồm hàm main nơi biến chuỗi “MyStr” được khai báo. Chuỗi cũng được khởi tạo với ký tự chuỗi khi khai báo. Giá trị chuỗi sẽ in ra shell. Sau đó, có câu lệnh if áp dụng điều kiện trên chuỗi cho trước.
Gọi phương thức empty bên trong điều kiện if để kiểm tra chuỗi không rỗng. Sau đó, phương thức erase iterator dùng trên chuỗi và xóa ký tự đầu tiên từ chuỗi chỉ định. Chuỗi sẽ in ra màn hình shell với ký tự đầu tiên bị xóa.
#include <iostream>
#include <string>
int main()
{
std::string MyStr = "rainbow";
std::cout << "String Before:" << MyStr << std::endl;
if (!MyStr.empty()) {
MyStr.erase(MyStr.begin());
}
std::cout << "String Now:" << MyStr << std::endl;
return 0;
}
Chúng ta có chuỗi đầu ra sau:

Ví Dụ 4: Xóa Ký Tự Đầu Tiên Với Ký Tự Khớp Trong C++
Bây giờ, có ví dụ xóa ký tự đầu tiên nếu nó tương ứng với ký tự cụ thể, dùng cú pháp sau:
Biến chuỗi được khởi tạo với giá trị chuỗi và đặt tên “Name” trong hàm main của chương trình sau. Hiển thị chuỗi bằng lệnh cout. Sau đó, định nghĩa biến khác, “ch”, kiểu char. Biến char “ch” gán ký tự “k” khớp với ký tự đầu tiên của chuỗi trước.
Sau đó, dùng câu lệnh if kiểm tra điều kiện giá trị ký tự “k” khớp với giá trị ký tự đầu tiên của chuỗi. Có hàm front(), dùng để lấy ký tự đầu tiên trong tham chiếu chuỗi. Ký tự đầu tiên của chuỗi sau đó sẽ bị loại bỏ dùng erase iterator.
#include <iostream>
#include <string>
int main()
{
std::string Name = "Kalsoom";
std::cout << "Name Before: " << Name << std::endl;
char ch = 'K';
if (Name.front() == ch) {
Name.erase(Name.begin());
}
std::cout << "Name Now: " << Name << std::endl;
return 0;
}
Như bạn thấy, ký tự đầu tiên bị xóa khỏi chuỗi như sau:

Ví Dụ 5: Xóa Ký Tự Đầu Tiên Từ Chuỗi Dùng Phương Thức substr() Trong C++
Chuỗi được sửa đổi tại chỗ (in place) dùng phương thức string::erase. Dùng hàm string::substr, bạn có thể lấy bản sao của chuỗi không có ký tự cuối cùng.
Chúng ta dùng hàm substr trên chuỗi “MyString” trong khối if. Hàm substr truyền với vị trí ký tự đầu tiên và độ dài chuỗi trừ 1 (-1). Nó trả về chuỗi mới tạo từ đối tượng chuỗi gọi chứa các ký tự chỉ định.
#include <iostream>
#include <string>
int main()
{
std::string MyString = "Bringing";
std::cout << "Original String: "<< MyString << std::endl;
std::string n;
if (!MyString.empty()) {
n = MyString.substr(1, MyString.size() - 1);
}
std::cout << "Changed String: " << n << std::endl;
return 0;
}
Phương thức substr đã xóa lần xuất hiện đầu tiên của ký tự khỏi chuỗi, như hiển thị trong shell sau:

Kết Luận
Trong C++, chúng ta đã học các phương pháp thay thế để xóa ký tự đầu tiên từ chuỗi. Các phương pháp này trả về cùng đầu ra nhưng triển khai khác nhau trong chương trình C++. Đây là các phương pháp C++ hiệu quả để xóa các lần xuất hiện đầu tiên của ký tự từ chuỗi. Hy vọng các phương pháp này sẽ hữu ích cho bạn.