Xem thêm

Các thao tác trên Mảng ký tự (C-style strings)

Huy Erick
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ý...

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:

Các thao tác trên Mảng ký tự (C-style strings)

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:

Các thao tác trên Mảng ký tự (C-style strings)

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()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()_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:

Các thao tác trên Mảng ký tự (C-style strings)

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:

Các thao tác trên Mảng ký tự (C-style strings)

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:

Các thao tác trên Mảng ký tự (C-style strings)

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:

Các thao tác trên Mảng ký tự (C-style strings)

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.

1