Tách chuỗi trong C++ (strtok) | Laptrinhcanban.com

Tách chuỗi trong C++ (strtok)

Hướng dẫn cách tách chuỗi chuỗi trong C++. Bạn sẽ học được cách tách chuỗi trong C++ bằng các hàm tách chuỗi strtok(), cũng như các lưu ý khi sử dụng hàm strtok() trong C++ sau bài ọc này.

Tách chuỗi trong C++ | hàm strtok

Hàm strtok() trong C++ là một hàm có sẵn trong header file cstring, giúp chúng ta tách chuỗi trong chuỗi C++ bằng ký tự chỉ định.

Để có thể sử dụng được hàm strtok(), chúng ta cần phải viết thêm dòng #include <cstring> để load header file cstring vào trong chuơng trình.

Chúng ta sử dụng hàm strtok() để tách chuỗi trong chuỗi C++ với cú pháp sau đây:

strtok(str, sep)

Trong đó:

  • str là chuỗi cần tách
  • sep là ký tự phân tách. (sep viết tắt separator)

Hàm strtok() sẽ trả về vị trí đầu chuỗi của chuỗi con đầu tiên được phân tách bằng dấu phân cách từ chuỗi ban đầu dưới dạng con trỏ chuỗi trong C++. Trong trường hợp không tìm thấy ký tự phân tách , giá trị NULL sẽ được trả về.

Cơ chế của hàm strtok() là điền ký tự kết thúc chuỗi \0 vào chuỗi ban đầu mỗi khi tìm thấy ký tự phân tách, do đó cần lưu ý là hàm strtok() sẽ làm biến đổi chuỗi ban đầu.

Lại nữa, hàm strtok() chỉ có thể tách một chuỗi con bằng dấu phân tách từ chuỗi ban đầu trong mỗi lần thực thi mà thôi.

Ví dụ cụ thể:

#include <iostream>
#include <cstring>
using namespace std;

int main(){
char str[50] = "Ha Noi,Ninh Binh,Nam Dinh,Thanh Hoa";

//Khai báo con trỏ chuỗi để chứa kết quả
char * p;

p = strtok(str, ",");
cout << p;
}
//Ha Noi

Ở ví dụ này, hàm strtok() sẽ hoạt động với các bước như sau:

  1. Hàm strtok() bắt đầu tìm vị trí ký tự phân tách là dấu , ở bên trong chuỗi str.

  2. Sau khi tìm thấy vị trí dấu phẩy đầu tiên, hàm strtok() sẽ điền ký tự kết thúc chuỗi \0 vào vị trí tìm thấy. Khi đó, chuỗi ban đầu sẽ chuyển thành dạng Ha Noi\0Ninh Binh,Nam Dinh,Thanh Hoa.

  3. Hàm strtok() quay trở về đầu chuỗi ban đầu và trả về vị trí đầu chuỗi này dưới dạng con trỏ chuỗi trong C++. Cuối cùng khi in con trỏ chuỗi này, chuỗi sẽ được in ra từ vị trí đầu chuỗi là ký tự H cho đến ký tự thúc chuỗi \0 (Ha Noi\0), do đó chuỗi kết quả Ha Noi sẽ được in ra màn hình.

Tách toàn bộ chuỗi con từ chuỗi trong C++ | hàm strtok

Ở phần trên chúng ta đã biết hàm strtok() trong C++ chỉ có thể giúp chúng ta tách một chuỗi con bằng dấu phân tách từ chuỗi ban đầu trong mỗi lần sử dụng mà thôi.

Do đó, để có thể tách toàn bộ chuỗi con từ chuỗi ban đầu trong C++ thì sau lần tách đầu tiên, chúng ta cần phải tạo ra một vòng lặp để lần lượt tách các chuỗi con con lại từ chuỗi ban đầu bằng hàm strtok().

Và lựa chọn sáng giá ở đây chính là vòng lặp while, khi mà chúng ta vốn không biết rõ số vòng lặp cần dùng là bao nhiêu trong chương trình.

Chúng ta sẽ viết chương trình tách toàn bộ chuỗi con từ chuỗi trong C++ như sau:

#include <iostream>
#include <cstring>
using namespace std;

int main(){
char str[50] = "Ha Noi,Ninh Binh,Nam Dinh,Thanh Hoa";
char * p;

//Tách chuỗi con lần đầu tiên
p = strtok(str, ",");
cout << p <<endl;

//Tách chuỗi con từ lần thứ 2 trở đi
//Bằng cách sử dụng hàm strok cho tới khi kết quả NULL được trả về.
while(p != NULL) {
//Chỉ dịnh đối số NULL trong hàm strtok để tiếp tục tách chuỗi ban đầu
p = strtok(NULL, ",");

if(p != NULL) {
cout<< p<<endl;
}
}
return 0;
}

Kết quả:

Ha Noi
Ninh Binh
Nam Dinh
Thanh Hoa

Ở đây chúng ta cần phải lưu ý rằng:

  1. Lần gọi hàm strtok() đầu tiên và các lần tiếp theo là khác nhau.

  2. Trong lần gọi strtok đầu tiên, chúng ta phải chỉ định đối số của hàm là chuỗi ban đầu để bắt đầu tách chuỗi. Trong các lần gọi tiếp theo, chúng ta phải chỉ định NULL làm đối số của hàm. Đối số này sẽ yêu cầu hàm tiếp tục tách từ chuỗi ban đầu đã truyền vào từ trước đó. Nếu chúng ta chỉ định lại chuỗi ban đầu hoặc một chuỗi khác thì kết quả hàm sẽ không tiếp tục tách nữa mà sẽ bắt đầu xử lý lại từ đầu.

  3. Khi không còn tìm thấy ký tự phân tách từ trong chuỗi ban đầu nữa, kết quả NULL sẽ được trả về, và khi đó thì vòng lặp While sẽ kết thúc.

Lưu ý khi tách chuỗi trong C++ bằng hàm strtok

Lưu ý thứ nhất
Giống như Kiyoshi đã phân tích ở trên, thì do cơ chế hàm strtok() sẽ điền thêm ký tự kết thúc chuỗi \0 vào các vị trí tìm thấy ký tự phân tách, nên chuỗi ban đầu sẽ bị thay đổi sau khi chúng ta sử dụng hàm strtok().

Bởi vậy, lưu ý đầu tiên khi sử dụng hàm này đó chính là, chuỗi ban đầu sẽ bị thay đổi. Do đó, bạn cần phải backup chuỗi này bằng cách copy nó chẳng hạn trước khi dùng hàm, và đối với các chuỗi không được thay đổi trong chương trình, thì bạn đừng sử dụng chuỗi với hàm strtok nhé.

Cách copy chuỗi có thể tham khảo tại bài dưới đây:

Lưu ý thứ hai
Chúng ta không nhất thiết chỉ chỉ định một ký tự làm ký tự phân tách, mà có thể chỉ định ký tự phân tách bằng chuỗi ký tự. Ví dụ như chúng ta có thể kết hợp nhiều dấu dấu cách với cụm từ để làm ký tự phân tách " and " như sau:

#include <iostream>
#include <cstring>
using namespace std;

int main(){
char str[50] = "Tom and Jerry and me";
char * p;

p = strtok(str, " and ");
cout << p <<endl;

while(p != NULL) {
p = strtok(NULL, " and ");
if(p != NULL) {
cout << p <<endl;
}
}
return 0;
}

Kết quả:

Tom
Jerry
me

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn cách tách chuỗi chuỗi trong C++ rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về C++ trong các bài học tiếp theo.

HOME>> >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.