Giới thiệu
Trong bài viết trước đó, chúng ta đã tìm hiểu về Mảng ký tự trong c+ +. Hôm nay, mình sẽ chia sẻ với các bạn về "Các thao tác mới trên Mảng ký tự (C-style strings) trong C++". Chúng ta sẽ khám phá những thao tác thú vị và hữu ích mà ngôn ngữ C++ cung cấp để làm việc với Mảng ký tự.
Nội dung
Để được hiểu rõ về bài viết này, các bạn nên có kiến thức cơ bản về:
- Kiểu ký tự trong C++ (Character)
- Mảng một chiều (Arrays)
- Mảng ký tự trong C++ (C-style strings)
Trong bài viết này, chúng ta sẽ tìm hiểu về một số thao tác thường được sử dụng với Mảng ký tự (C-style strings).
Tìm độ dài của Mảng ký tự
Để biết độ dài của một Mảng ký tự (không bao gồm ký tự null '\0'), chúng ta có thể sử dụng hàm strlen()
. Hãy xem ví dụ sau:
#include #include using namespace std; int main() { char szTeam[20] = "Kteam"; // Mảng có 20 phần tử (5 ký tự thường, 15 ký tự null '\0') cout << "Team của tui: " << szTeam << endl; cout << szTeam << " có " << strlen(szTeam) << " ký tự." << endl; cout << szTeam << " có " << sizeof(szTeam) << " phần tử trong mảng." << endl; return 0; }
Output:
Lưu ý: Hàm strlen()
in ra số ký tự trước ký tự null '\0', trong khi sizeof()
trả về kích thước của toàn bộ mảng.
Chuyển đổi chữ hoa và chữ thường
Để chuyển một chuỗi ký tự từ chữ thường sang chữ in hoa và ngược lại, chúng ta có thể sử dụng hai hàm sau:
-
strlwr()
: chuyển chuỗi thành chữ thường ('A' thành 'a', 'B' thành 'b', ..., 'Z' thành 'z'). -
strupr()
: chuyển chuỗi thành chữ in hoa ('a' thành 'A', 'b' thành 'B', ..., 'z' thành 'Z').
Hãy xem ví dụ dưới đây:
#define _CRT_NONSTDC_NO_DEPRECATE #include #include using namespace std; int main() { char szString1[] = "Hello Howkteam.com!"; char szString2[] = "Hello Howkteam.com!"; cout << "s1: " << szString1 << endl; cout << "s2: " << szString2 << endl; strlwr(szString1); strupr(szString2); cout << "s1: " << szString1 << endl; cout << "s2: " << szString2 << endl; return 0; }
Output:
Một số trình biên dịch hiện đại thường cảnh báo về việc sử dụng hàm strlwr()
và strupr()
, và yêu cầu lập trình viên thêm dòng lệnh #define _CRT_NONSTDC_NO_DEPRECATE
vào đầu chương trình để có thể sử dụng hai hàm này. Trong C++ 11, hai hàm _strlwr_s()
và _strupr_s()
có thể được sử dụng để thay thế.
Sao chép Mảng ký tự
Để sao chép một chuỗi ký tự sang một chuỗi khác, chúng ta có thể sử dụng hàm strcpy()
. Xem ví dụ sau:
#define _CRT_SECURE_NO_WARNINGS #include #include using namespace std; int main() { char szSource[] = "Kteam"; char szDest[20]; strcpy(szDest, szSource); cout << "Source: " << szSource << endl; cout << "Dest: " << szDest << endl; return 0; }
Output:
Lưu ý: Khi sử dụng hàm này, chuỗi đích phải đủ lớn để chứa được chuỗi nguồn. Nếu không, vấn đề tràn mảng sẽ xảy ra.
Một số trình biên dịch hiện đại thường cảnh báo về việc sử dụng hàm strcpy()
là không an toàn, và yêu cầu lập trình viên thêm dòng lệnh #define _CRT_SECURE_NO_WARNINGS
vào đầu chương trình để có thể sử dụng hàm strcpy()
. Trong C++ 11, hàm strcpy_s()
được sử dụng để thay thế, hàm này có thêm một tham số cho phép xác định độ dài của chuỗi đích. Nếu chuỗi đích không đủ lớn để chứa chuỗi nguồn, trình biên dịch sẽ ném ra một assert trong chế độ debug và kết thúc chương trình.
Nối hai Mảng ký tự
Để nối một chuỗi vào sau chuỗi khác, chúng ta có thể sử dụng hàm strcat()
. Xem ví dụ dưới đây:
#define _CRT_SECURE_NO_WARNINGS #include #include using namespace std; int main() { char szSource[] = "Howkteam.com!"; char szDest[100] = "Hello"; strcat(szDest, " "); // "Hello " strcat(szDest, szSource); // "Hello Howkteam.com!" cout << "Dest: " << szDest << endl; return 0; }
Output:
Lưu ý: Khi sử dụng hàm strcat()
, chuỗi đích phải đủ lớn để chứa thêm chuỗi được nối vào. Nếu không, vấn đề tràn mảng sẽ xảy ra.
Một số trình biên dịch hiện đại thường cảnh báo về việc sử dụng hàm strcat()
là không an toàn, và yêu cầu lập trình viên thêm dòng lệnh #define _CRT_SECURE_NO_WARNINGS
vào đầu chương trình để có thể sử dụng hàm strcat()
. Trong C++ 11, hàm strcat_s()
được sử dụng để thay thế, hàm này có thêm một tham số cho phép xác định độ dài của chuỗi đích. Nếu chuỗi đích không đủ lớn để chứa thêm chuỗi nguồn, trình biên dịch sẽ ném ra một assert trong chế độ debug và kết thúc chương trình.
So sánh hai Mảng ký tự
Để so sánh hai chuỗi ký tự s1 và s2 (phân biệt chữ hoa và chữ thường), chúng ta có thể sử dụng hàm strcmp()
. Giá trị trả về của hàm như sau:
- Nhỏ hơn 0 nếu s1 < s2.
- Bằng 0 nếu s1 == s2.
- Lớn hơn 0 nếu s1 > s2.
Xem ví dụ sau:
#include #include using namespace std; int main() { char szString1[] = "howkteam.com!"; char szString2[] = "Howkteam.com!"; cout << "s1: " << szString1 << endl; cout << "s2: " << szString2 << endl; int result = strcmp(szString1, szString2); if (result < 0) cout << "s1 < s2" << endl; else if (result > 0) cout << "s1 > s2" << endl; else cout << "s1 == s2" << endl; return 0; }
Output:
Tìm kiếm chuỗi trong chuỗi
Để tìm vị trí xuất hiện đầu tiên của một chuỗi (s2) trong một chuỗi khác (s1), chúng ta có thể sử dụng hàm strstr()
. Giá trị trả về của hàm như sau:
- Nếu tìm thấy: trả về con trỏ đến vị trí xuất hiện đầu tiên của chuỗi s2 trong chuỗi s1.
- Nếu không tìm thấy: trả về NULL.
Khái niệm con trỏ sẽ được nhắc tới trong bài viết "Con trỏ cơ bản trong C++ (Pointers)". Xem ví dụ dưới đây:
#include #include using namespace std; int main() { char szString1[] = "Hello Howkteam.com!"; char szString2[] = "kteam"; cout << "s1: " << szString1 << endl; cout << "s2: " << szString2 << endl; if (strstr(szString1, szString2) != NULL) cout << "Tìm thấy " << szString2 << " trong " << szString1 << endl; else cout << "Không tìm thấy!" << endl; return 0; }
Output:
Kết luận
Qua bài viết này, chúng ta đã tìm hiểu về các thao tác mới trên Mảng ký tự (C-style strings) trong C++. Còn rất nhiều thao tác khác trên mảng ký tự, trong phạm vi bài viết này không thể đề cập hết được. Các bạn hãy tự mình tìm hiểu và chia sẻ với cộng đồng nhé.
Trong bài tiếp theo, mình sẽ giới thiệu về "Từ khóa auto trong C++ (The auto keyword)".
Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý để chúng ta có thể phát triển bài viết tốt hơn. Đừng quên "Luyện tập - Thử thách - Không ngại khó".
Thảo luận
Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bình luận bên dưới hoặc trong mục Hỏi & Đáp trên thư viện Howkteam.com để được sự hỗ trợ từ cộng đồng.